正确处理唯一NULL值的方法

时间:2016-06-14 11:46:37

标签: 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, 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它意味着规划涉及所有猫。由于我不希望计划重复,我不希望null值也是唯一的。但Django / Postgres不会将null视为值,因此不会触发重复错误。

我如何设法改变这个?我应该创建另一个领域吗? 感谢您的帮助,我的想法已经用完了。

1 个答案:

答案 0 :(得分:1)

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

  

当索引声明为唯一时,多个表行等于   不允许使用索引值。空值不被认为是平等的。   多列唯一索引仅拒绝所有索引的情况   列在多行中相等。

参考:https://www.postgresql.org/docs/9.5/static/indexes-unique.html

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

all_cats = Cat.objects.create(name='__allcats__', ....)

然后,您可以记下它的主键,或者将名称字段与__allcats__进行比较,以确定FoodPlanningOnDemand是否适用于所有猫或一只猫。

你可以为CatsPad做同样的事情