장고 모델() 대 Model.objects.create()
2개의 명령어를 실행하는 경우의 차이점:
foo = FooModel()
그리고.
bar = BarModel.objects.create()
두 번째 것은 즉시 생성됩니까?BarModel
데이터베이스 내, 동안FooModel
,그save()
데이터베이스에 추가하려면 메서드를 명시적으로 호출해야 합니까?
https://docs.djangoproject.com/en/stable/topics/db/queries/ #작성-실행
개체를 한 번에 만들고 저장하려면
create()
방법.
의 차이점Model()
그리고.Model.objects.create()
다음과 같습니다.
삽입과 갱신
Model.save()
는 DB 내의 오브젝트를 삽입 또는 갱신합니다.Model.objects.create()
는 삽입만 합니다.Model.save()
한다UPDATE 객체의 기본 키 속성이 다음과 같이 평가되는 값으로 설정되어 있는 경우
True
INSERT 객체의 프라이머리 키 속성이 설정되어 있지 않거나 UPDATE가 아무것도 업데이트하지 않은 경우(프라이머리 키가 데이터베이스에 존재하지 않는 값으로 설정되어 있는 경우 등).
기존 기본 키
프라이머리 키 속성이 값으로 설정되어 있고 이러한 프라이머리 키가 이미 존재하는 경우
Model.save()
UPDATE를 실행하지만Model.objects.create()
올리다IntegrityError
.다음 모델을 고려하십시오.py:
class Subject(models.Model): subject_id = models.PositiveIntegerField(primary_key=True, db_column='subject_id') name = models.CharField(max_length=255) max_marks = models.PositiveIntegerField()
다음을 사용하여 DB 삽입/업데이트
Model.save()
physics = Subject(subject_id=1, name='Physics', max_marks=100) physics.save() math = Subject(subject_id=1, name='Math', max_marks=50) # Case of update math.save()
결과:
Subject.objects.all().values() <QuerySet [{'subject_id': 1, 'name': 'Math', 'max_marks': 50}]>
다음을 사용하여 DB에 삽입
Model.objects.create()
Subject.objects.create(subject_id=1, name='Chemistry', max_marks=100) IntegrityError: UNIQUE constraint failed: m****t.subject_id
설명:이 예에서는
math.save()
UPDATE(변경)name
물리부터 수학까지max_marks
100 ~ 50)의 이유subject_id
프라이머리 키와subject_id=1
DB에 이미 존재합니다.그렇지만Subject.objects.create()
올리다IntegrityError
, 다시 프라이머리 키이기 때문에subject_id
가치가 있는1
는 이미 존재합니다.
강제 삽입
Model.save()
처럼 행동하게 할 수 있다Model.objects.create()
을 사용하여force_insert=True
파라미터:Model.save(force_insert=True)
.
반환값
Model.save()
돌아가다None
어디에Model.objects.create()
모델 인스턴스를 반환합니다.package_name.models.Model
결론: Model.objects.create()
모델 초기화 및 수행save()
와 함께force_insert=True
.
소스코드에서 발췌한 것Model.objects.create()
def create(self, **kwargs):
"""
Create a new object with the given kwargs, saving it to the database
and returning the created object.
"""
obj = self.model(**kwargs)
self._for_write = True
obj.save(force_insert=True, using=self.db)
return obj
자세한 내용은 다음 링크를 참조하십시오.
두 구문이 동일하지 않아 예기치 않은 오류가 발생할 수 있습니다.다음은 차이점을 보여주는 간단한 예입니다.모델이 있는 경우:
from django.db import models
class Test(models.Model):
added = models.DateTimeField(auto_now_add=True)
첫 번째 개체를 만듭니다.
foo = Test.objects.create(pk=1)
그런 다음 동일한 기본 키를 사용하여 개체를 생성하려고 합니다.
foo_duplicate = Test.objects.create(pk=1)
# returns the error:
# django.db.utils.IntegrityError: (1062, "Duplicate entry '1' for key 'PRIMARY'")
foo_duplicate = Test(pk=1).save()
# returns the error:
# django.db.utils.IntegrityError: (1048, "Column 'added' cannot be null")
업데이트 15.3.2017:
저는 이것에 관한 장고호를 개설했습니다.여기서 사전접수를 받고 있는 것 같습니다.https://code.djangoproject.com/ticket/27825
으로는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★Constructor
)ORM
참조에 클래스 ( 참조)1.10.5
수 입력 할 수 ).예: "이다"(", "M") §:
models
class Payment(models.Model):
amount_cash = models.DecimalField()
some_test.py
-object.create
Class SomeTestCase:
def generate_orm_obj(self, _constructor, base_data=None, modifiers=None):
objs = []
if not base_data:
base_data = {'amount_case': 123.00}
for modifier in modifiers:
actual_data = deepcopy(base_data)
actual_data.update(modifier)
# Hacky fix,
_obj = _constructor.objects.create(**actual_data)
print(type(_obj.amount_cash)) # Decimal
assert created
objs.append(_obj)
return objs
some_test.py
-Constructor()
Class SomeTestCase:
def generate_orm_obj(self, _constructor, base_data=None, modifiers=None):
objs = []
if not base_data:
base_data = {'amount_case': 123.00}
for modifier in modifiers:
actual_data = deepcopy(base_data)
actual_data.update(modifier)
# Hacky fix,
_obj = _constructor(**actual_data)
print(type(_obj.amount_cash)) # Float
assert created
objs.append(_obj)
return objs
Model.objects.create()
이치노 Model()
는 메모리 모델인스턴스만 만듭니다.""를 되지 않습니다.save()
저장 방법을 지정합니다.그 때 검증도 이루어집니다.
언급URL : https://stackoverflow.com/questions/26672077/django-model-vs-model-objects-create
'programing' 카테고리의 다른 글
도커 마리아 데이터베이스에 접속하려면 어떻게 해야 하나요? (0) | 2022.09.21 |
---|---|
MySQL find_in_set(복수 검색 문자열 포함) (0) | 2022.09.21 |
라라벨에서 phpunit을 사용하여 특정 테스트 클래스를 테스트하는 방법 (0) | 2022.09.21 |
기존 테이블에 자동 증가 기본 키 삽입 (0) | 2022.09.21 |
Java에서 null 값을 확인하는 가장 좋은 방법? (0) | 2022.09.21 |