当前位置: 首页 > 知识库问答 >
问题:

Django Model()vs Model。物体。创建()

仲君昊
2023-03-14

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

foo = FooModel()

bar = BarModel.objects.create()

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

共有3个答案

欧阳正德
2023-03-14

这两个语法不相等,可能导致意外错误。下面是一个简单的示例,显示了这些差异。如果您有一个模型:

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")
鲁博雅
2023-03-14

Model()Model.objects.create()之间的区别如下:

>

模型。save()在数据库中插入或更新对象,而模型。物体。create()只执行插入操作。

模型。save()does

>

  • 如果对象的主键属性设置为计算结果为True

    INSERT如果对象的主键属性未设置或UPDATE未更新任何内容(例如,如果主键设置为数据库中不存在的值)。

    现有主键

    如果主键属性设置为一个值,并且这样的主键已经存在,那么Model.save()执行UPDATE,但是Model.objects.create()引发完整性错误

    考虑下面的模型。py:

    class Subject(models.Model):
       subject_id = models.PositiveIntegerField(primary_key=True, db_column='subject_id')
       name = models.CharField(max_length=255)
       max_marks = models.PositiveIntegerField()
    

    >

    physics = Subject(subject_id=1, name='Physics', max_marks=100)
    physics.save()
    math = Subject(subject_id=1, name='Math', max_marks=50)  # Case of update
    math.save()
    

    结果:

    Subject.objects.all().values()
    <QuerySet [{'subject_id': 1, 'name': 'Math', 'max_marks': 50}]>
    

    使用模型插入数据库。物体。create()

    Subject.objects.create(subject_id=1, name='Chemistry', max_marks=100)
    IntegrityError: UNIQUE constraint failed: m****t.subject_id
    

    说明:在本例中,math.save()执行UPDATE(将name从物理更改为Math,并将max_marks从100更改为50),因为subject_id是主键并且>subject_id=1已经存在于DB中。但是Subject.objects.create()引发了整体错误,因为主键subject_id的值1已经存在。

    强制插入

    模型。save()可以按模型进行操作。物体。使用force\u insert=True参数:模型创建()。保存(force\u insert=True)

    返回值

    模型。save()returnNonewhereModel。物体。create()返回模型实例,即包名称。模型。型号

    结论:模型。物体。create()使用force\u insert=True执行模型初始化并执行save()

    摘自Model.objects.create()的源代码

    def create(self, **kwargs):
        """
        Create a new object with the given kwargs, saving it to the database
        and returning the created object.
        """
        obj = self.model(**kwargs)
        self._for_write = True
        obj.save(force_insert=True, using=self.db)
        return obj
    

    有关更多详细信息,请访问以下链接:

    >

  • https://docs.djangoproject.com/en/stable/ref/models/querysets/#create

    https://github.com/django/django/blob/2d8dcba03aae200aaa103ec1e69f0a0038ec2f85/django/db/models/query.py#L440

  • 凤明朗
    2023-03-14

    https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-物体

    若要在单个步骤中创建和保存对象,请使用创建()方法。

     类似资料:
    • 在 3D 场景初始化后,我们可以通过 create() 方法来创建物体,例如,加载模型、添加标记、创建基本形体等。我们还可以通过 create() 方法来加载园区,例如,添加多个园区。通过 destroy() 方法,可以销毁物体,即在场景中删除物体。 创建物体的语法 下面的代码中,通过 create() 方法创建物体,并通过对象名称和属性,来添加所创建的物体属性。 var obj = app.cr

    • 我试着让两个立方体以不同的方式旋转。 为了设置旋转,我这样做。 在多维数据集类内部,我没有使用GL11.glLoadId相()来重置旋转,而是做了这样的事情。 这将重置每个轴的旋转。 数组“rot”保存x、y和z旋转,并通过多维数据集类中的这3种方法进行更新。 单独地,每个GL11.glRotatef(etc, etc, etc)和GL11.glRotatef(etc*-1.0f, etc, et

    • 本文向大家介绍matplotlib 创建人物,包括了matplotlib 创建人物的使用技巧和注意事项,需要的朋友参考一下 示例 该图包含所有绘图元素。创建图形的主要方法matplotlib是使用pyplot。 您可以选择提供一个数字,该数字可用于访问先前创建的图形。如果未提供数字,则最后创建的图形的ID将增加并使用;数字从1开始索引,而不是0。 数字也可以用字符串代替数字,而不是数字。如果使用交

    • 问题内容: 我是Node.js的新手,我敢肯定对此有一个简单的答案,我只是找不到它:( 我正在使用文件系统来保存“程序包”(状态扩展名为“ mypackage.idle”的文件夹),用户可以对这些程序执行操作,这将导致状态变为“ qa”或“部署”等。如果服务器正在接受大量请求,并且同一包中有多个请求,我将如何检查状态,然后执行一个操作,这将更改状态,从而确保在操作之前/期间另一个请求没有更改它发生

    • 这是Three.js中大部分对象的基类,提供了一系列的属性和方法来对三维空间中的物体进行操纵。 请注意,可以通过.add( object )方法来将对象进行组合,该方法将对象添加为子对象,但为此最好使用Group(来作为父对象)。 构造器 Object3D() 构造器中不带有参数。 属性 .animations : AnimationClip Array with object's animati

    • 自动识别图像中主体轮廓,与背景进行分离,返回分割后的Alpha图、前景物体图,适应多物体,复杂背景。服饰、男女装、鞋帽、首饰、箱包、化妆品、饮料、快销品、宠物等等,所有明确主体的品类都可以识别分割,电商特别适用,适应复杂背景和光线。模式一 返回二进制文件流模式二 返回base64字符串模式三 通过图片URL返回base64结果 抠图API调用示例代码 github地址: https://githu