如何在Django中创建忽略NULL的唯一约束?

时间:2018-06-20 15:22:17

标签: sql django

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

然后,对unique_together也有同样的问题。有没有一种方法可以强制执行unique_together,但是如果任何字段为NULL,则允许该行?

1 个答案:

答案 0 :(得分:2)

我不确定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字段上没有唯一性约束,两个字段中唯一性在一起。