【问题标题】:Validating the type of django queryset related objects parameters验证 django 查询集相关对象参数的类型
【发布时间】:2017-06-06 12:26:42
【问题描述】:

django 是否提供了一种方法来验证 django 查询集中的模型类型,例如通过相关对象进行过滤?假设我们有以下模型:

class Person(models.Model):
    name = models.CharField(max_length=5)

class Author(models.Model):
    name = models.CharField(max_length=25)

class Book(models.Model):
    name = models.CharField(max_length=5)
    author = models.ForeignKey(Author)

还有

p = Person.objects.all().first()
query = Book.objects.filter(author=p)

过滤所有 auhtor_id 等于给定 person_id (p_id) 的书籍,尽管 Book 指的是作者,而不是人。

当然,避免此类错误是程序员的责任,但这是有可能的。

这发生在 django 1.7 中

【问题讨论】:

  • 运行该代码时会发生什么?
  • 至少在 django 1.7 中它通过 author_id=p.pk 过滤 Book
  • @pteo 对于维护你的代码的人来说,让它按 id 过滤会更有意义,而不是默认情况下,这在版本之间显然是不一致的。请记住,这两个模型甚至一开始就没有关系。
  • 这是怎么工作的?! Person 和 Author 是完全不同的模型……!!
  • @Fazil Zaid 不要感到惊讶。不信就试试吧……

标签: python django django-queryset


【解决方案1】:
p = Person.objects.all().first()
query = Book.objects.filter(author=p)

你真的试过这个吗?根据我的说法,它应该引发 ValueError 类似于“必须是作者实例”的内容

现在如果你想避免这个错误,你需要使用一个 id,Moses 像往常一样有一个很好的答案来说明它是如何完成的。

【讨论】:

  • 至少在 django 1.7 中它执行时不会引发任何异常
  • 可能已经在 1.7 中完成了,我忘记了,但当前版本肯定有这个验证。
  • 类型检查是added in Django 1.8。 Django 1.7 已经结束生命有一段时间了。
【解决方案2】:

如果author_idperson_id 相同,则可以过滤 直接使用id:

query = Book.objects.filter(author_id=p.id)

【讨论】:

  • 我认为最好使用p.pk 而不是p.id
  • 个人喜好问题
  • 但是author_id 可能不同于person_id
  • @pteo 那么您希望这两个模型如何匹配?此外,您可以使用其他模型属性进行过滤.filter(author__name=p.name)
猜你喜欢
  • 2012-03-30
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2018-09-13
  • 1970-01-01
  • 2015-10-01
  • 2018-10-14
相关资源
最近更新 更多