2016-06-14 80 views
1

我用下面的模型:正确的方式来处理独特的NULL值

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视为一个值,因此不会触发重复错误。

我该如何设法改变这种情况?我应该创建另一个领域? 我用尽了想法,感谢您的帮助。

+0

空不Postgres的价值 - 这是'不VALUE'值,所以才分配“not_a_cat”像NaN或任何其他“不相同定义的值”值? 。 –

+0

感谢您的评论。你认为NullableBoolean可以做到吗? –

+0

postgres'boolean'有两个值 - 0/1 :) –

回答

1

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

当索引声明具有相同 索引值独特的,多表行是不允许的。空值不被视为相等。 多列唯一索引只会拒绝所有索引为 列的行在多行中相等的情况。

裁判:https://www.postgresql.org/docs/9.5/static/indexes-unique.html

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

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

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

您可以CatsPad做同样的

+0

感谢这个,我用了另一种方法,但这个也很好。问题是它创建了一个抽象的数据库对象。 –

相关问题