Yanıtlar:
https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects
Tek bir adımda bir nesne oluşturmak ve kaydetmek için
create()
yöntemi kullanın .
İki sözdizimi eşdeğer değildir ve beklenmedik hatalara yol açabilir. Farklılıkları gösteren basit bir örnek. Bir modeliniz varsa:
from django.db import models
class Test(models.Model):
added = models.DateTimeField(auto_now_add=True)
Ve bir ilk nesne oluşturursunuz:
foo = Test.objects.create(pk=1)
Sonra aynı birincil anahtarla bir nesne oluşturmaya çalışın:
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()
bir zorunlu alan (hatta eğer bir nesne oluşturur null=False
) eksik? Projeme testler ekliyorum ve create
beklenmedik sonuçlar elde
CharField
olsa bile null=False
: bunun nedeni, Django'nun dizeleri varsayılan olarak boş bir dizeye ayarlamasıdır, ""
bu nedenle teknik olarak değilnull
obj = MyModel()
sonra, obj.full_clean()
şimdilik.
15.3.2017 GÜNCELLEME:
Bu konuda bir Django sorunu açtım ve burada ön kabul gibi görünüyor: https://code.djangoproject.com/ticket/27825
Benim tecrübem, Constructor
( ORM
) sınıfını Django ile yapılan başvurularda kullanırken 1.10.5
verilerde bazı tutarsızlıklar olabilir (yani, oluşturulan nesnenin öznitelikleri ORM nesnesi özelliğinin döküm türü yerine girdi verilerinin türünü alabilir) :
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