首页 > 解决方案 > 如何在 Django 中创建一个忽略 NULL 的唯一约束?

问题描述

Django 如何使用其唯一索引处理 NULL?有没有办法允许许多 NULL 行,同时对非空值强制唯一性?

然后,对于 unique_together 的相同问题。有没有办法强制执行 unique_together,但如果任何字段为 NULL,是否允许该行?

标签: sqldjango

解决方案


我不确定 MySQL,但 SQLite 和 PostgreSQL 不认为NULL值是相等的,所以你正在寻找的行为实际上是默认值。

您可以自己验证这一点:

class MyModel(models.Model):
    title = models.CharField(unique=True, null=True, max_length=255)

>>> MyModel.objects.create()
<MyModel: MyModel object (1)>
>>> MyModel.objects.create()
<MyModel: MyModel object (2)>

对于一个unique_together

class MyModel(models.Model):
    title = models.CharField(null=True, max_length=255)
    description = models.CharField(null=True, max_length=255)

    class Meta:
        unique_together = (('title', 'description'),)

>>> MyModel.objects.create(title='x')
<MyModel: MyModel object (1)>
>>> MyModel.objects.create(title='x')
<MyModel: MyModel object (2)>

请注意,在第二个示例中,字段没有唯一性约束title,只有两个字段上的唯一性。


推荐阅读