Django 模型 - 字段依赖

Posted

技术标签:

【中文标题】Django 模型 - 字段依赖【英文标题】:Django models - field dependency 【发布时间】:2012-03-23 00:35:21 【问题描述】:

我怎样才能有字段依赖?

案例1:如果设置了布尔字段call_me,则必须设置telephone,否则为空

案例 2:如果多对多字段 category(值为 salerent)的值为 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 将不起作用。但是,您可以通过用于编辑此内容的任何 ModelFormclean 方法来执行此操作,无论是在管理员还是您自己的视图中。

但是,当唯一可能的值是“sale”和“rent”时,将category 用作 M2M,是糟糕的设计。即便如此,“销售”和“租赁”是相互排斥的,因此 M2M 无论如何都不合适(您的模型永远不会同时经历“销售”和“租赁”)。

因此,将category 设置为CharFieldchoices 由“sale”和“rent”组成会是一个更好的主意。如果你这样做,你可以使用你模型的 clean 方法,就像案例 1 一样。

【讨论】:

感谢您的回复——对于案例 2,categories 可以出售、出租和/或度假,所以我猜我需要加入表。如何在 M2M 字段中要求至少一行?对案例2的依赖呢? (我对 Python/Django 很陌生)【参考方案2】:

案例一:

不要那样做,有一个不同的电话号码表,并有一个从人(我假设它是一个人)到电话号码的ForeignKey。如果您每人有多个电话号码,请反过来使用,否则请考虑使用OneToOne

显然您希望ForeignKey 可以为空。这样一来,拥有电话号码的唯一方法就是对方提供了电话号码。

案例 2:

我不明白你这里的数据库设计,所以我无法回答。您将不得不解释更多 - 为什么需要ManyToMany

【讨论】:

以上是关于Django 模型 - 字段依赖的主要内容,如果未能解决你的问题,请参考以下文章

Django模型:依赖字段

依赖于模型的 Django 小部件

django cms 插件上的动态模型选择字段

以原子方式比较-交换 Django 中的模型字段

Django:扩展其他应用程序的模型

模型层字段