जवाबों:
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
प्रदान नहीं किया गया है तो एक त्रुटि नहीं उठाएगा: ऐसा इसलिए है क्योंकि Django सेट को डिफ़ॉल्ट रूप से एक खाली स्ट्रिंग ""
null
obj = MyModel()
, तो obj.full_clean()
अभी के लिए।
अद्यतन 15.3.2017:
मैंने इस पर एक Django- मुद्दा खोला है और यह यहां प्रारंभिक रूप से स्वीकार किया गया लगता है: 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