如何确保设置至少一对多关系?
例如:如果我的listing
模型的图像字段与images
有多对多的关系。如何确保至少设置一个图像
奖金问题:如果最低限度不是一个,该怎么办?什么是最大值?
答案 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()
实例。
选择一个而不是另一个,而不仅仅是一个设计决策,这不是对错。这两种方法都可以实现您的需求,并在模型层中保留业务/域逻辑(即您的验证规则)。