【问题标题】:Django: Filtering on the related object, removing duplicates from the resultDjango:过滤相关对象,从结果中删除重复项
【发布时间】:2010-12-31 02:17:57
【问题描述】:

鉴于以下模型:

class Blog(models.Model):
    name = models.CharField()

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    content = models.CharField()

我希望将以下内容传递给模板:

blogs  = Blog.objects.filter(entry__content__contains = 'foo')
result = [(blog, blog.entry_set.filter(content__contains = 'foo'))
          for blog in blogs]
render_to_response('my.tmpl', {'result': result}

但是,如果找到多个匹配条目,“Blog.objects.filter(...)”会多次返回同一个博客对象。

如何删除重复项?或者更好的是,我是否错过了一种将匹配列表传递给模板的更简单方法?

【问题讨论】:

  • 我有基本相同(但更明显)的问题。为什么首先会有重复项? filter 不应该限制集合吗?我认为这是 django 中的一个错误,不是吗?有点像code.djangoproject.com/ticket/12625

标签: django filter duplicates


【解决方案1】:

添加 .distinct() 只会给您带来不同的结果。

【讨论】:

  • 如果你使用 distinct 和字段名 ex distinct('field_name'),需要注意的一点是,它不会在 mysql 上工作, 对 pgsql 有效。 src : docs.djangoproject.com/en/1.4/ref/models/querysets/… 滚动到“注意”。只是把我的头撞了一个小时,现在想应该清楚地阅读文档。 :)
【解决方案2】:

有关“distinct()”函数,请参见QuerySet API Docs

返回一个新的查询集,它使用 在其 SQL 查询中选择 DISTINCT。这 从 查询结果。

默认情况下,QuerySet 不会 消除重复行。在实践中, 这很少成为问题,因为 简单的查询,例如 Blog.objects.all() 不引入 重复结果行的可能性。 但是,如果您的查询跨越多个 表,可能会重复 评估 QuerySet 时的结果。 那时你会使用 distinct()。

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 2011-04-21
    • 2010-09-20
    • 2019-02-14
    • 1970-01-01
    • 2018-11-18
    • 2021-01-17
    相关资源
    最近更新 更多