当前位置: 首页 > 面试题库 >

Django:如何验证M2M关系?

韶英达
2023-03-14
问题内容

假设我有一个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关系。那我该如何验证它们呢?


问题答案:

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

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

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



 类似资料:
  • 问题内容: 我想创建一个与用户类对象之间的多对多关系。 我有这样的事情: 问题是我是否可以在内部使用类引用。还是我必须使用欧洲工商管理学院的?还是有另一种(更好的)方法呢? 问题答案:

  • 问题内容: 我已在中注释掉了csrf处理器和中间件产品线 但是,当我使用Ajax发送请求时,Django仍然会响应“ csrf令牌不正确或丢失”,并且在将X-CSRFToken添加到标头后,请求将会成功。 这里发生了什么 ? 问题答案: 如果只需要一些视图而不使用CSRF,则可以使用@csrf_exempt:

  • 我一直试图在一个我一直在做的网站上使用谷歌reCAPTCHA。验证码加载到网页上,但我无法使用几种方法验证它。我已经使用如何使用Python插件recaptcha客户端进行验证中给出的方法尝试了recaptcha验证?但我认为它已经过时了,因为它不再工作,它指的是挑战,而我试图使用的是谷歌新的“复选框”reCAPTCHA v2,或者我需要在安装recaptcha-client或django-rec

  • 我目前使用phonenumbers包作为我的Django的UserCreationForm的电话号码字段的验证方法。在我当前的代码中,我使用get方法从其字段中检索电话号码,然后进行验证。如果输入的数字不存在,将弹出一个表单错误,并声明该数字不是一个国家的格式(在本例中,我使用的是新加坡)。请告诉我应该对我当前的代码做什么修改。 我希望输出验证phone字段中输入的电话号码,没有国家代码,只有8位

  • 问题内容: 我在保存包含“直通”类表的m2m数据时遇到了麻烦。我想将所有选定的成员(在表单中选择)保存在通过表中。但是我不知道如何在视图中初始化“通过”表。 我的代码: 并在视图中: 我应该如何初始化要正确填充的Membership表的成员资格? 问题答案: 如果使用正常的m2m关系(不通过中间表),则可以替换: 与 但是,在使用中间表的情况下,你需要手动处理POST数据并创建具有所有必填字段的M

  • Apache CXF 3.1.8 Codegen-cxf-plugin禁用验证 我在我的ejb项目中使用Codegen-cxf-plugin作为soap客户端工作。 这是我的pom: