首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否验证一个对象存在2-5个关系?

是否验证一个对象存在2-5个关系?
EN

Stack Overflow用户
提问于 2015-07-03 03:19:15
回答 1查看 36关注 0票数 0

想象一下,我们正在构建一个投票网站,就像Django tutorial中的那个一样。

有两种模型。一个问题,一个选择。每个选择都有一个问题的外键。我们希望确保每个问题至少有两个选项,但不超过5个选项。

在创建问题时,您也可以同时创建选项。因此,这两个对象将同时保存。在保存问题对象时,如何验证它是否有2-5个与之相关的选项?

由于您不能在未保存的对象上设置关系,我不确定应该如何实现这一点。

我想到的第一个解决方案是在问题对象上设置一个pre_save钩子,但正如我刚才所说的,该对象当时尚未保存,因此选择对象不能与其有关系。

我想到的第二个解决方案是设置一个post_save钩子,在这里保存问题,然后保存选择,然后检查问题是否有2-5个选择。这个解决方案看起来非常老套,我相信还有更好的方法。

怎样才能获得这种功能呢?

如果有什么不同的话,我使用的是带有PostgreSQL 9.4的Django 1.8。

EN

回答 1

Stack Overflow用户

发布于 2015-07-03 04:44:01

您可以通过在可从继承的表单集中覆盖clean来执行此类型的验证:

代码语言:javascript
复制
from django.forms.models import BaseInlineFormSet


class RequiredFormSet(BaseInlineFormSet):

    def clean(self):
        for error in self.errors:
            # If any errors exist, return
            if error:
                return

        completed_formsets = 0
        for cleaned_data in self.cleaned_data:
            # only count the form if it's not being deleted
            if cleaned_data and not cleaned_data.get('DELETE', False):
                completed_formsets += 1

        if completed_formsets < 2 or completed_formsets > 5:
            raise forms.ValidationError("You must enter between "
                "2 and 5 {}".format(self.model._meta.verbose_name))

如果在那之后你需要用你的post数据调用API,你可以覆盖保存,或者在你的中执行,这对你的项目来说是最好的。

表单的最小/最大数量可以来自设置,也可以在实例化表单集时传入,而不是在本例中对它们进行硬编码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31192896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档