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可以做到吗?postgresboolean
有两个值-0/1:)这是我的意思-创建分类器。就像1是一种猫,2是第二种猫,3是所有其他猫一样,我不是使用了一个NullableBoolean
all_cats
,它由catspad
唯一,当cat
为null
时设置为True吗?谢谢,我使用了另一种方法,但这个方法也很好。问题是它创建了一个抽象的db对象。