如何进行django模型验证以排除

时间:2014-03-05 08:01:52

标签: python django validation django-models

在1.6 django教程中,在谈到测试之后,它说明当Poll没有index.html时,不应该使用Choice视图查看polls/model.py(此模型中的外键) )。我已经更新了模型,以便在def has_choices(self): if self.choice_set.count() == 0: return False else: return True

中检查这一点(希望这会有所帮助......)
model.BooleanField

这结果没有帮助,因为过滤器只能应用于存储在数据库中的数据,而函数不是。因此,我正在考虑潜在地制定验证规则,因此无论何时保存Poll对象,它都会更新一个新的布尔对象(Choice),因此我有一个数据列可用于此查询。但是,我发现在我实际添加选项时会保存Poll个对象而不是poll/view.py个对象。

这一切都说,我想不出如何向我的Poll.objects.exclude(....添加一个过滤器,以显示没有任何选择映射到它们的民意调查。我认为save()会起作用,但是对于那些没有任何外键映射到那些结果的选择加入查询会很复杂。

我是否已经复杂化这还是有一个优雅的解决方案吗?这个教程看起来很容易,但我发现自己正在进行一项比1.6教程复杂得多的练习。

任何答案都有效,但优雅的答案总会胜出!我是更新模型并重新使用对象的粉丝..但是如果我需要让模型也更新数据库(不仅仅是一个函数),那么我当然也可以做到这一点,只要新的列将对每个Poll事件进行验证(同样,对Choice或{{1}}对象也是如此!?)。

此链接在“更多测试的创意”下专门为https://docs.djangoproject.com/en/1.6/intro/tutorial05/

2 个答案:

答案 0 :(得分:3)

这可能有些过分,但一个相当不错的选择是使用聚合来注释选项的数量,并使其在进行过滤的自定义Manager模型上可用。类似的东西:

from django.db.models import Count
class PollManager(models.Manager):
    def with_counts(self):
        return self.get_queryset().annotate(choice_count=Count('choice')

    def choices_only(self):
        return self.with_counts().exclude(choice_count=0)


class Poll(models.Model):
    ...
    objects = PollManager()

现在您可以使用Poll.objects.choices_only()仅返回有选择的民意调查。

答案 1 :(得分:1)

  

这一切都说,我想不出如何在poll / view.py中添加过滤器   to EXCLUDE显示没有任何选择映射到他们的民意调查。一世   正在考虑一个Poll.objects.exclude(....会工作,但它会得到   加入对没有选择的选择加入查询很复杂   任何外键映射到那些结果。

Daniel的答案很棒,您可以直接在视图中使用它(无需修改模型):

have_choices = Poll.objects.annotate(choice_count=Count('choice')) \
                           .filter(choice_count__gt=0)

这里的过滤器更明确一点,您只是告诉我那些至少有一个选择的民意调查。