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
相关产品推荐
相关产品推荐

