想象一下,我们正在构建一个投票网站,就像Django tutorial中的那个一样。
有两种模型。一个问题,一个选择。每个选择都有一个问题的外键。我们希望确保每个问题至少有两个选项,但不超过5个选项。
在创建问题时,您也可以同时创建选项。因此,这两个对象将同时保存。在保存问题对象时,如何验证它是否有2-5个与之相关的选项?
由于您不能在未保存的对象上设置关系,我不确定应该如何实现这一点。
我想到的第一个解决方案是在问题对象上设置一个pre_save钩子,但正如我刚才所说的,该对象当时尚未保存,因此选择对象不能与其有关系。
我想到的第二个解决方案是设置一个post_save钩子,在这里保存问题,然后保存选择,然后检查问题是否有2-5个选择。这个解决方案看起来非常老套,我相信还有更好的方法。
怎样才能获得这种功能呢?
如果有什么不同的话,我使用的是带有PostgreSQL 9.4的Django 1.8。
发布于 2015-07-03 04:44:01
您可以通过在可从继承的表单集中覆盖clean来执行此类型的验证:
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,你可以覆盖保存,或者在你的中执行,这对你的项目来说是最好的。
表单的最小/最大数量可以来自设置,也可以在实例化表单集时传入,而不是在本例中对它们进行硬编码。
https://stackoverflow.com/questions/31192896
复制相似问题