Django 处理唯一空值的正确方法

Django 处理唯一空值的正确方法,django,postgresql,django-models,Django,Postgresql,Django Models,我使用以下模型: class FoodPlanningOnDemand(models.Model): catspad = models.ForeignKey('Catspad', null=False, blank=False) cat = models.ForeignKey('Cat', null=True, blank=True), amount = models.PositiveIntegerField(null=False, blank=False, defaul

我使用以下模型:

class FoodPlanningOnDemand(models.Model):
    catspad = models.ForeignKey('Catspad', null=False, blank=False)
    cat = models.ForeignKey('Cat', null=True, blank=True),
    amount = models.PositiveIntegerField(null=False, blank=False, default=5)
    food_limit = models.PositiveIntegerField(null=False, blank=False, default=0)
    name = models.CharField(max_length=128, null=True, blank=True)
    status = models.BooleanField(default=True, null=False)

    class Meta:
        unique_together = (('catspad', 'cat'))
cat
字段是一种特殊的字段,因为如果
null
则表示计划涉及所有cat。由于我不希望计划是重复的,所以我也不希望
null
值是唯一的。但是Django/Postgres不会将
null
视为一个值,因此不会触发重复错误

我怎样才能改变这一点?我应该创建另一个字段吗?
我的想法快用完了,谢谢你的帮助。

正如其他人在评论中指出的,
NULL
不是一个值

当一个索引被声明为唯一时,多个表行具有相同的 不允许使用索引值。空值被视为不相等。 多列唯一索引只会拒绝所有列都已索引的情况 多行中的列相等

参考:

如果这不是您想要的,您需要创建一个可以识别为所有猫的唯一猫,例如:

all_cats = Cat.objects.create(name='__allcats__', ....)
然后,您可以记下它的主键,或者将名称字段与
\uuuu allcats\uuuu
进行比较,以确定
FoodPlanningOnDemand
是否适用于所有猫或单个猫


您也可以对CatsPad执行同样的操作

null不是postgres中的值-它是
非值
值,因此只需像NaN或任何其他“相同非定义值”值一样指定“非定义值”。谢谢您的评论。你认为NullableBoolean可以做到吗?postgres
boolean
有两个值-0/1:)这是我的意思-创建分类器。就像1是一种猫,2是第二种猫,3是所有其他猫一样,我不是使用了一个
NullableBoolean
all_cats
,它由
catspad
唯一,当
cat
null
时设置为True吗?谢谢,我使用了另一种方法,但这个方法也很好。问题是它创建了一个抽象的db对象。