运行两个命令之间的区别是什么:
foo = FooModel()
和
bar = BarModel.objects.create()
第二个是否立即在数据库中创建 BarModel ,而对于 FooModel ,必须显式调用 save() 方法才能将其添加到数据库中?
BarModel
FooModel
save()
https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects
要在一个步骤中创建和保存对象,请使用create()方法 .
更新15.3.2017:
我在这上面打开了一个Django问题,这里似乎已经初步接受了:https://code.djangoproject.com/ticket/27825
我的经验是,当通过Django 1.10.5 引用使用 Constructor ( ORM )类时,数据中可能存在一些不一致(即创建的对象的属性可能获取输入数据的类型而不是ORM对象的类型属性)示例:
1.10.5
Constructor
ORM
models
class Payment(models.Model): amount_cash = models.DecimalField()
some_test.py - object.create
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()
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
这两种语法不相同,可能会导致意外错误 . 这是一个显示差异的简单示例 . 如果您有型号:
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")
3 回答
https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects
更新15.3.2017:
我在这上面打开了一个Django问题,这里似乎已经初步接受了:https://code.djangoproject.com/ticket/27825
我的经验是,当通过Django
1.10.5
引用使用Constructor
(ORM
)类时,数据中可能存在一些不一致(即创建的对象的属性可能获取输入数据的类型而不是ORM对象的类型属性)示例:models
some_test.py
-object.create
some_test.py
-Constructor()
这两种语法不相同,可能会导致意外错误 . 这是一个显示差异的简单示例 . 如果您有型号:
然后你创建了第一个对象:
然后尝试使用相同的主键创建对象: