2016-06-14 36 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

感謝這個,我用了另一種方法,但這個也很好。問題是它創建了一個抽象的數據庫對象。 –

相關問題