2012-03-05 131 views
3

如何獲得字段依賴關係?Django模型 - 字段依賴關係

案例1:如果布爾場call_me設置,然後telephone必須設置,否則它應該是空白

案例2:如果多對多場category(其值銷售租金)有該值銷售之一,那麼price_sale必須設置,否則它應該是空白

+2

聽起來像你有你的模型佈局嚴重。嘗試規範化你的數據庫模式。 – cha0site 2012-03-05 14:38:29

+0

它的哪部分看起來不正確? – RS7 2012-03-05 19:08:55

回答

4

對於案例1,你可以很容易地在模型的clean方法驗證:

from django.core.exceptions import ValidationError 

class MyModel(models.Model): 
    ... 
    def clean(self): 
     if self.call_me and not self.telephone.strip(): 
      raise ValidationError('Telephone is required') 

對於第2種情況,不添加M2M的關係,直到模型保存後,因此,使用clean你的模式不會在這種情況下工作。但是,您可以使用任何ModelFormclean方法來編輯此操作,無論是在管理員還是您自己的視圖中。

但是,有category作爲M2M時唯一可能的值是「sale」和「rent」,是差的設計。即使這樣,「銷售」和「租金」是互相排斥的,所以M2M是不合適的(您的模型將不會同時出現「銷售」和「租金」)。

因此,將category作爲CharFieldchoices組成「銷售」和「租金」將是一個更好的主意。如果你這樣做,那麼你可以使用你的模型的clean方法,就像情況1一樣。

+0

感謝您的回覆 - 對於案例2,「類別」可以是銷售,出租和/或假期,所以我猜我需要擁有連接表。我如何在M2M領域至少需要一行?情況2的依賴情況如何? (我對Python/Django很新穎) – RS7 2012-03-05 19:03:15

0

案例1:

不要那樣做,有電話號碼的不同的表,並有從人一ForeignKey(我假設它是一個人)的電話號碼。如果您每人有多個電話號碼,請反過來,否則請考慮使用OneToOne

很顯然你會希望ForeignKey爲空。這樣,擁有電話號碼的唯一方法就是該人提供了一個電話號碼。

案例2:

這裏我就不明白你的數據庫設計,所以我不能回答。你必須解釋更多 - 爲什麼你需要在這裏ManyToMany