Python Django模型-字段依赖关系

Python Django模型-字段依赖关系,python,django,validation,model,Python,Django,Validation,Model,如何具有字段依赖关系 案例1:如果设置了布尔字段call\u me,则必须设置telephone,否则应为空 案例2:如果多对多字段类别(值为销售,租金)的其中一个值为销售,则必须设置价格(销售),否则案例1应为空,您可以在模型的清洁方法中轻松验证: from django.core.exceptions import ValidationError class MyModel(models.Model): ... def clean(self): if

如何具有字段依赖关系

案例1:如果设置了布尔字段
call\u me
,则必须设置
telephone
,否则应为空


案例2:如果多对多字段
类别
(值为销售租金)的其中一个值为销售,则必须设置
价格(销售
),否则案例1应为空

,您可以在模型的
清洁
方法中轻松验证:

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
在这种情况下不起作用。但是,您可以通过任何用于编辑此内容的
ModelForm
clean
方法来执行此操作,无论是在管理员还是您自己的视图中

然而,当唯一可能的值是“销售”和“租金”时,将
类别
作为M2M是糟糕的设计。即使这样,“销售”和“租赁”也是互斥的,所以M2M无论如何都是不合适的(你的模型永远不会同时经历“销售”和“租赁”)

因此,最好将
category
设为
CharField
,其中
选项包括“销售”和“租赁”。如果您这样做,那么您也可以使用与案例1相同的方式使用模型的
clean
方法进行此操作。

案例1:

不要这样做,要有一个不同的电话号码表,并有一个从此人(我假设是个人)到电话号码的
ForeignKey
。如果你每人有一个以上的电话号码,就用另一种方式做,否则考虑使用<代码> OneToOne < /C> > < /P> 显然,您希望
ForeignKey
可以为空。那样的话,获得电话号码的唯一方法就是提供一个

案例2:


我不理解你的数据库设计,所以我无法回答。你需要解释更多-为什么你需要一个
manytomy
在这里?

听起来你的模型布局很糟糕。尝试规范化您的数据库架构。它的哪一部分似乎不正确?感谢您的回复--对于案例2,
类别可以是销售、租赁和/或度假,因此我猜我需要使用联接表。如何要求M2M字段中至少有一行?对案例2的依赖性如何?(我对Python/Django相当陌生)