特定字段为 True 时的 Django 唯一性约束

ajw*_*ood 3 django

我有一个像这样的 Django 模型:

class Process(Place):
    isRunning = models.BooleanField(default=True)
    name      = models.CharField(max_length=20)
Run Code Online (Sandbox Code Playgroud)

我想强制该name字段在isRunning为真时是唯一的。

这个约束在 Django 模型中可能吗?


这可能是这个问题的重复,但它没有一个公认的答案,而且自从被问到之后 Django 已经开发了很多。

Kev*_*nry 13

如果您的数据库支持它,您可以设置一个部分唯一索引

部分索引是建立在表子集上的索引;子集由条件表达式(称为部分索引的谓词)定义。该索引仅包含满足谓词的那些表行的条目。

在 2.2 版以下,对此没有特殊的 Django 支持,但您可以在数据迁移中进行设置(有关更多详细信息,请参见此处)。

在你的情况下,它看起来像:

operations = [
    migrations.RunSQL("CREATE UNIQUE INDEX running_name ON app_process(isRunning, name)
                       WHERE isRunning"),
]
Run Code Online (Sandbox Code Playgroud)

从 2.2 版开始,您可以简单地在模型中声明部分唯一索引

from django.db.models import Q, UniqueConstraint

class Process(Place):
    ...
    class Meta:
        constraints = [UniqueConstraint(fields=["name"], condition=Q(isRunning=True))]
Run Code Online (Sandbox Code Playgroud)