Python 如何将django模型验证排除在外
在1.6 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 事实证明,这没有帮助,因为过滤器只能应用于数据库中存储的内容,而函数不是。因此,我考
轮询
视图没有选项
(此模型中的外键)时,不应使用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