Django模型 - 至少有一对多

时间:2012-03-07 00:04:16

标签: python django validation model many-to-many

如何确保设置至少一对多关系?

例如:如果我的listing模型的图像字段与images有多对多的关系。如何确保至少设置一个图像

奖金问题:如果最低限度不是一个,该怎么办?什么是最大值?

1 个答案:

答案 0 :(得分:3)

您可以实现一个函数来检查Listing实例是否至少有一个图像实例,并将该函数连接到Listing模型的pre_save signal

它会是这样的(假设你使用的是django 1.3)

from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import Listing
...
@receiver(pre_save, sender=Listing)
def check_image_requirement(sender, instance, **kwargs):
    if instance.images.count() == 0:
        raise your_own_exception("Listing is required to have at least one image")

您需要实现your_own_exception

以下补充是对PO的进一步问题的回复

实现Listing.clean()是实现相同验证规则的另一种方法。实际上,这是语义上正确的方法,因为Model.clean()用于自定义模型验证。但采用这种方法会不太方便 - 触发clean()您必须手动调用full_clean()(如果您不使用模型表单),或手动调用is_valid()(当在调用Listing实例的save()之前使用模型表单。 Reference

另一方面,使用pre_save信号方法,您可以确定每当您在实例上调用Listing时,验证规则始终应用于save()实例。

选择一个而不是另一个,而不仅仅是一个设计决策,这不是对错。这两种方法都可以实现您的需求,并在模型层中保留业务/域逻辑(即您的验证规则)。