Django 模型 - 字段依赖
Posted
技术标签:
【中文标题】Django 模型 - 字段依赖【英文标题】:Django models - field dependency 【发布时间】:2012-03-23 00:35:21 【问题描述】:我怎样才能有字段依赖?
案例1:如果设置了布尔字段call_me
,则必须设置telephone
,否则为空
案例 2:如果多对多字段 category
(值为 sale、rent)的值为 sale 之一,那么必须设置price_sale
,否则为空
【问题讨论】:
听起来你的模型布局很糟糕。尝试规范化您的数据库架构。 哪一部分看起来不正确? 【参考方案1】:对于案例 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
将不起作用。但是,您可以通过用于编辑此内容的任何 ModelForm
的 clean
方法来执行此操作,无论是在管理员还是您自己的视图中。
但是,当唯一可能的值是“sale”和“rent”时,将category
用作 M2M,是糟糕的设计。即便如此,“销售”和“租赁”是相互排斥的,因此 M2M 无论如何都不合适(您的模型永远不会同时经历“销售”和“租赁”)。
因此,将category
设置为CharField
和choices
由“sale”和“rent”组成会是一个更好的主意。如果你这样做,你可以使用你模型的 clean
方法,就像案例 1 一样。
【讨论】:
感谢您的回复——对于案例 2,categories
可以出售、出租和/或度假,所以我猜我需要加入表。如何在 M2M 字段中要求至少一行?对案例2的依赖呢? (我对 Python/Django 很陌生)【参考方案2】:
案例一:
不要那样做,有一个不同的电话号码表,并有一个从人(我假设它是一个人)到电话号码的ForeignKey
。如果您每人有多个电话号码,请反过来使用,否则请考虑使用OneToOne
。
显然您希望ForeignKey
可以为空。这样一来,拥有电话号码的唯一方法就是对方提供了电话号码。
案例 2:
我不明白你这里的数据库设计,所以我无法回答。您将不得不解释更多 - 为什么需要ManyToMany
?
【讨论】:
以上是关于Django 模型 - 字段依赖的主要内容,如果未能解决你的问题,请参考以下文章