回答:
https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects
1つのステップでオブジェクトを作成して保存するには、
create()
メソッドを使用します。
2つの構文は同等ではなく、予期しないエラーが発生する可能性があります。以下は、違いを示す簡単な例です。モデルがある場合:
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