Django:如何验证M2M关系?

发布于 2021-01-29 15:03:19

假设我有一个Basket模型,并且想验证是否5 Item可以添加s个以上的代码:

class Basket(models.Model):
    items = models.ManyToManyField('Item')

    def save(self, *args, **kwargs):
        self.full_clean()
        super(Basket, self).save(*args, **kwargs)

    def clean(self):
        super(Basket, self).clean()
        if self.items.count() > 5:
            raise ValidationError('This basket can\'t have so many items')

但是,试图保存时,Basket一个RuntimeError因为超过最大递归深度被抛出。

错误如下:

ValueError: "<Basket: Basket>" needs to have a value for field "basket" before this many-to-many relationship can be used.

它发生if self.items.count() > 5:在行中。

显然,在保存模型时,Django的复杂性根本不允许您验证m2m关系。那我该如何验证它们呢?

关注者
0
被浏览
57
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    永远无法 使用模型的干净方法来验证关系。这是因为在清理时间,该模型可能不存在,就像您的购物篮一样。不存在的东西,也可能没有关系。

    您要么需要对@bhattravii指出的表单数据进行验证,要么调用form.save(commit=False)并实现一个称为的方法save_m2m来实现限制。

    要在模型级别强制执行限制,您需要收听m2m_changed信号。请注意,向最终用户提供反馈要困难得多,但这确实可以防止通过其他方式将篮子过度装满。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看