gpt4 book ai didi

python - Django 模型——多对多中的至少一个

转载 作者:太空狗 更新时间:2023-10-29 21:55:38 27 4
gpt4 key购买 nike

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

例如:如果我有一个 listing 模型,它有一个 image 字段,与 images 存在多对多关系。如何保证至少设置一张图片

奖励问题:如果最小值不是 1 怎么办?最大值呢?

最佳答案

您可以实现一个函数来检查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")

你需要在哪里实现你的_own_exception

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

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

另一方面,使用pre_save 信号方法,无论何时调用save( ) 在实例上。

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

关于python - Django 模型——多对多中的至少一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9593881/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com