首页 > 解决方案 > 当 PK 为 None 时,为什么 Django 在 INSERT 之前执行 UPDATE?

问题描述

我有一个带有 UUID 主键的模型:

    id = models.UUIDField(
        primary_key = True,
        default = uuid.uuid4,
        editable = False,
        null = False,
        blank = False,
        help_text = 'The unique identifier of the Node.'
    )

我要解决的问题是 Django似乎总是在插入之前尝试更新。

Django Docs似乎明确说明了行为应该是什么:如果pk是,None那么它将INSERT首先尝试,否则将尝试UPDATE.

当我创建一个 ModelInstance 时,它​​会自动填充id一个 UUID,所以它不是没有。有没有办法让它不这样做?

无论如何,即使我设置idpk创建None,它仍然UPDATE第一个:

my_totally_new_node = Node(data = data, id = None, pk = None)
my_totally_new_node.id
> None
my_totally_new_node.pk
> None
reset_queries()

my_totally_new_node.save()

connection.queries
> [{'sql': 'UPDATE "connection_p...::uuid", 'time': '0.002'}, {'sql': 'INSERT INTO "connect...::bytea)", 'time': '0.001'}]

总结一下:

  1. 有没有办法可以使 ID 字段的默认行为不在创建时填充,但仍然在保存时填充?
  2. 任何想法为什么 Django 没有遵循记录的行为,pk并且None仍在尝试INSERT第一个?

我知道save(force_insert=True)解决方法,但我正在寻找更好的方法,部分原因create是不支持这种解决方法。

标签: pythondjangopostgresqldjango-modelsdjango-database

解决方案


推荐阅读