【发布时间】:2018-11-29 19:06:19
【问题描述】:
Django 如何处理带有唯一索引的 NULL?有没有办法允许许多 NULL 行,同时对非空值强制唯一性?
然后,针对 unique_together 的相同问题。有没有办法强制执行 unique_together,但如果任何字段为 NULL,是否允许该行?
【问题讨论】:
Django 如何处理带有唯一索引的 NULL?有没有办法允许许多 NULL 行,同时对非空值强制唯一性?
然后,针对 unique_together 的相同问题。有没有办法强制执行 unique_together,但如果任何字段为 NULL,是否允许该行?
【问题讨论】:
我不确定 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 字段没有唯一性约束,只有两个字段上的唯一性。
【讨论】: