2012-03-05 95 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