Django模型 - 至少有一对多

RS7*_*RS7 7 python django validation many-to-many model

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

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

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

tam*_*are 3

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

它会是这样的,(假设你使用的是 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")
Run Code Online (Sandbox Code Playgroud)

你需要实现 your_own_exception 的地方

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

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

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

选择其中一个并没有对错之分,而只是一种设计决策。两种方法都可以实现您所需要的并将业务/域逻辑(即您的验证规则)保留在模型层中。