首页 文章

Django Model()vs Model.objects.create()

提问于
浏览
164

运行两个命令之间的区别是什么:

foo = FooModel()

bar = BarModel.objects.create()

第二个是否立即在数据库中创建 BarModel ,而对于 FooModel ,必须显式调用 save() 方法才能将其添加到数据库中?

3 回答

  • 146

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

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

  • 7

    更新15.3.2017:

    我在这上面打开了一个Django问题,这里似乎已经初步接受了:https://code.djangoproject.com/ticket/27825

    我的经验是,当通过Django 1.10.5 引用使用 ConstructorORM )类时,数据中可能存在一些不一致(即创建的对象的属性可能获取输入数据的类型而不是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
    
  • 8

    这两种语法不相同,可能会导致意外错误 . 这是一个显示差异的简单示例 . 如果您有型号:

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

相关问题