답변:
https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects
단일 단계에서 객체를 생성하고 저장하려면이
create()
방법을 사용하십시오 .
두 구문은 동일하지 않으며 예기치 않은 오류가 발생할 수 있습니다. 차이점을 보여주는 간단한 예는 다음과 같습니다. 모델이있는 경우 :
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")
.create()
필수 필드가 (경우에도 객체 생성 null=False
)없는가? 프로젝트에 테스트를 추가하고 create
예기치 않은 결과가 발생합니다
CharField
설정되어 null=False
있지 않으면 오류가 발생하지 않습니다. 장고는 기본적으로 빈 문자열로 문자열을 설정하여 ""
기술적으로는 그렇지 않기 때문입니다.null
obj = MyModel()
후, obj.full_clean()
지금.
업데이트 15.3.2017 :
나는 이것에 대해 장고 이슈를 열었고 여기에서 예비 적으로 받아 들여지는 것 같습니다 : https://code.djangoproject.com/ticket/27825
내 경험은 Django와 함께 참조로 Constructor
( ORM
) 클래스 를 사용할 때 1.10.5
데이터에 약간의 불일치가있을 수 있습니다 (즉, 작성된 객체의 속성이 캐스트 된 유형의 ORM 객체 속성 대신 입력 데이터의 유형을 얻을 수 있음) 예제 :
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