Python 如何将django模型验证排除在外

Python 如何将django模型验证排除在外,python,django,validation,django-models,Python,Django,Validation,Django Models,在1.6 django教程中,在谈到测试之后,它说明了当轮询视图没有选项(此模型中的外键)时,不应使用index.html视图查看该轮询。我已经更新了模型,以便在polls/model.py def has_choices(self): if self.choice_set.count() == 0: return False else: return True 事实证明,这没有帮助,因为过滤器只能应用于数据库中存储的内容,而函数不是。因此,我考

在1.6 django教程中,在谈到测试之后,它说明了当
轮询
视图没有
选项
(此模型中的外键)时,不应使用
index.html
视图查看该轮询。我已经更新了模型,以便在
polls/model.py

def has_choices(self):
    if self.choice_set.count() == 0:
        return False
    else:
        return True
事实证明,这没有帮助,因为过滤器只能应用于数据库中存储的内容,而函数不是。因此,我考虑制定一个验证规则,以便在保存轮询对象时,它会更新一个新的布尔对象(
model.BooleanField
),因此我有一个用于此查询的数据列。然而,我突然想到,当我实际添加选项时,
Choice
对象将被保存,而不是
Poll
对象

综上所述,我想不出如何在我的
poll/view.py
中添加一个过滤器,以排除那些没有任何选项映射到它们的民意测验。我在想,
Poll.objects.exclude(…
可以工作,但是如果要针对没有任何外键映射到这些结果的选项加入查询,就会变得复杂

我是不是把这件事复杂化了,还是有一个优雅的解决方案?教程让它看起来很简单,但我发现自己正在做一个比1.6教程复杂得多的练习

任何答案都有效,但优雅的答案总是胜出!我喜欢更新模型并将其用于对象。但是,如果我需要模型也更新数据库(不仅仅是函数),那么我当然也可以这样做,只要新列在每次
save()
事件时都进行验证(同样,这是针对
轮询
还是
选择
对象!?)


该链接特别位于“更多测试的想法”下。

这可能有些过分,但一个相当不错的选择是使用聚合来注释选择的数量,并在执行筛选的自定义管理器模型上提供该选项。例如:

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()
只返回有选择的轮询。

这可能有些过分,但一个相当不错的选择是使用聚合来注释选择的数量,并在执行筛选的自定义管理器模型上提供这些选项。例如:

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\u only()
只返回有选择的轮询

总而言之,我想不出如何在poll/view.py中添加过滤器 排除显示未映射任何选项的投票。I 我在想一个Poll.objects.exclude(…..可以工作,但后来它变得 将查询与没有选择的选项关联起来会很复杂 映射到这些结果的任何外键

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

这里的过滤器更明确一些,你说的是只显示那些至少有一个选择的投票

总而言之,我想不出如何在poll/view.py中添加过滤器 排除显示未映射任何选项的投票。I 我在想一个Poll.objects.exclude(…..可以工作,但后来它变得 将查询与没有选择的选项关联起来会很复杂 映射到这些结果的任何外键

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


这里的过滤器更明确一些,你说的是只显示那些至少有一个选择的投票。

我相信更好的名字应该是
has\u choices
我相信更好的名字应该是
has\u choices