You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中bulk_create含update_conflicts=True多唯一约束异常问题

问题:Django bulk_create 处理含NULL字段的唯一约束冲突

我定义了如下Django模型:

class XYZ(Model):
    id = models.BigAutoField(primary_key=True)
    keys_1 = models.IntegerField()
    keys_2 = models.JSONField(null=False, default=dict)
    keys_3 = models.DateField(null=True, default=None)
    values = models.JSONField(null=False, default=dict)

    class Meta:
        db_table = "xyz"

        constraints = [
            models.UniqueConstraint(
                fields=["keys_1", "keys_2"],
                name="unicity_when_keys_3_null",
                condition=Q(keys_3__isnull=True),
            ),
            models.UniqueConstraint(
                fields=["keys_1", "keys_2", "keys_3"],
                name="unicity",
            ),
        ]

执行批量创建/更新代码:

XYZ.objects.bulk_create(
        data,
        update_conflicts=True,
        unique_fields=["keys_1", "keys_2", "keys_3"],
        update_fields=["values"],
)

其中data是XYZ对象列表,出现如下问题:

  • 当data[n].keys_3不为None时,执行正常
  • 当data[n].keys_3为None时,会触发unicity_when_keys_3_null约束冲突导致失败

请问我的操作是否有误?

补充说明:

  • 以下两种写法不可用:
XYZ.objects.bulk_create(
        data,
        update_conflicts=True,
        unique_fields=["keys_1", "keys_2"],
        update_fields=["values"],
)

XYZ.objects.bulk_create(
        data,
        update_conflicts=True,
        unique_fields=["keys_1", "keys_2"],
        update_fields=["values", "keys_3"],
)
  • 以下约束修改无效:
constraints = [
            models.UniqueConstraint(
                fields=["keys_1", "keys_2"],
                name="unicity_when_keys_3_null",
                condition=Q(keys_3__isnull=True),
            ),
            models.UniqueConstraint(
                fields=["keys_1", "keys_2", "keys_3"],
                name="unicity",
                condition=Q(keys_3__isnull=False),
            ),
        ]
  • 可行的临时解决方案:
for row in data: # 此处data为字典列表
            ProductDataSourceValues.objects.update_or_create(
                key_1=row["key_1"],
                key_2=row["key_2"],
                key_3=row["key_3"],
                defaults={"values": row["values"]},
            )

内容的提问来源于stack exchange,提问作者simaximum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:57:25