假设我们有一个模型
from django.db import models
class Concept(models.Model):
a = models.CharField(max_length=255)
b = models.CharField(max_length=255)
c = models.CharField(max_length=255)
d = models.CharField(max_length=255)
class Meta:
constraints = [
models.UniqueConstraint(
fields=('a', 'b'),
name='first_two_constraint'),
]
我想执行bulk_create
在此模型上,当违反“first_two_constraint”的唯一约束时,将执行更新。
对于sqlite3,特点https://github.com/django/django/blob/main/django/db/backends/sqlite3/features.py#L44 https://github.com/django/django/blob/main/django/db/backends/sqlite3/features.py#L44迫使unique_fields
被传递给bulk_create
功能。然而,我并不清楚那应该是什么。https://github.com/django/django/blob/829f4d1448f7b40238b47592fc17061bf77b0f23/django/db/models/query.py#L701 https://github.com/django/django/blob/829f4d1448f7b40238b47592fc17061bf77b0f23/django/db/models/query.py#L701
我尝试了约束的名称,但是失败了。跟踪,自此列表以来发生unique_fields
具体来说是字段名称,并且约束不会有字段名称。https://github.com/django/django/blob/829f4d1448f7b40238b47592fc17061bf77b0f23/django/db/models/query.py#L768 https://github.com/django/django/blob/829f4d1448f7b40238b47592fc17061bf77b0f23/django/db/models/query.py#L768
结果,我不知道如何处理这个问题。
基于 sqlite3 文档,https://www.sqlite.org/lang_conflict.html https://www.sqlite.org/lang_conflict.html子标题“REPLACE”,该功能应该是可能的,因为即使它是多个列,违规仍然是唯一约束违规“当发生唯一或主键约束违规时......”
有谁对如何处理多列约束有任何见解bulk_create
函数或确认唯一的方法是使用原始 SQL?
我不相信它有unique_fields=('a', 'b')
因为这代表两个单独的列约束,对吗?