python - 我如何执行 django 模型验证以排除

标签 python django validation django-models

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

中轻松检查(希望这会有所帮助...)
def has_choices(self):
    if self.choice_set.count() == 0:
        return False
    else:
        return True

事实证明这没有帮助,因为过滤器只能应用于数据库中存储的内容,而函数不是。因此,我正在研究潜在的验证规则,以便在保存 Poll 对象时,它会更新一个新的 bool 对象 (model.BooleanField),因此我有一个数据列可用于此查询.但是,我随后想到,当我实际添加一个选项时,将保存 Choice 对象,而不是 Poll 对象。

综上所述,我想不出如何向我的 poll/view.py 添加过滤器以排除显示没有任何选择映射到它们的民意调查。我在想一个 Poll.objects.exclude(.... 会起作用,但随后加入针对没有任何外键映射到这些结果的 Choices 的查询变得复杂。

我是不是把这个复杂化了,还是有一个优雅的解决方案?教程让它看起来非常简单,但我发现自己进行的练习比 1.6 的教程复杂得多。

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

链接具体是https://docs.djangoproject.com/en/1.6/intro/tutorial05/在“更多测试的想法”下。

最佳答案

这可能有点矫枉过正,但一个相当不错的选择是使用聚合来注释选择的数量,并使其在执行过滤的自定义管理器模型上可用。像这样的东西:

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

关于python - 我如何执行 django 模型验证以排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22191879/

相关文章:

python - 捕获生成器内的错误并随后继续

python - Django 测试套件 URL 覆盖率

python - 如何清除这两个小部件以及它们被其他小部件清除

python - 如何测试文件是否包含完整路径或仅包含文件名,Python?

python - 使用 NLTK 库对一堆 txt 文件使用 TF-IDF 进行标记化和词形还原

python - Django:上传的文件编码问题

python - Django中实现自动加锁解锁记录应该重写哪些方法

java - 验证是否可以与 Controller 中增强的参数一起使用?

excel - Excel中IP地址的数据验证

validation - 使用 golang 验证 yaml 模式(语义检查)