gpt4 book ai didi

python - Django:如何验证 m2m 关系?

转载 作者:行者123 更新时间:2023-12-01 02:34:56 25 4
gpt4 key购买 nike

假设我有一个 Basket 模型,我想验证不能向其中添加超过 5 Item:

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 关系。那么我该如何验证它们呢?

最佳答案

永远无法在模型的 clean 方法中验证关系。这是因为在清理时,模型可能还不存在,就像您的篮子的情况一样。不存在的东西,也不可能有关系。

您需要对 form data 进行验证正如 @bhatravii 所指出的,或者调用 form.save(commit=False) 并实现一个名为 save_m2m 的方法。 ,它实现了限制。

要在模型级别强制实现限制,您需要收听 m2m_changed信号。请注意,向最终用户提供反馈要困难得多,但它确实可以通过不同的方式防止篮子装得太满。

关于python - Django:如何验证 m2m 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46362251/

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