Django模型()与Model.objects.create()

运行两个命令有什么区别:

foo = FooModel() 

 bar = BarModel.objects.create() 

第二个是否立即在数据库创buildBarModel ,而对于FooModel ,则必须显式调用save()方法才能添加它?

https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects

要在一个步骤中创build和保存对象,请使用create()方法。

更新15.3.2017:

我已经打开Django的问题,这似乎是初步接受在这里: https : //code.djangoproject.com/ticket/27825

我的经验是,当通过Django 1.10.5引用使用ConstructorORM )类时,数据中可能会有一些不一致的地方(即,创build的对象的属性可能会获得input数据的types,而不是input数据的typesORM对象属性)例子:

models

 class Payment(models.Model): amount_cash = models.DecimalField() 

some_test.pyobject.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.pyConstructor()

 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) 

你创build第一个对象:

 foo = Test.objects.create(pk=1) 

然后,您尝试使用相同的主键创build一个对象:

 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")