Django:过滤相关对象,从结果中删除重复项

kni*_*nap 10 django filter duplicates

鉴于以下型号:

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

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    content = models.CharField()
Run Code Online (Sandbox Code Playgroud)

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

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}
Run Code Online (Sandbox Code Playgroud)

但是,如果找到多个匹配条目,"Blog.objects.filter(...)"会多次返回相同的Blog对象.

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

Ign*_*ams 18

添加.distinct()将只给您不同的结果.

  • 如果您使用带有字段名称 ex distinct('field_name') 的 distinct ,则需要注意一个微妙的点,它不适用于 mysql,而 *only* 仅适用于 pgsql。src : https://docs.djangoproject.com/en/1.4/ref/models/querysets/#django.db.models.query.QuerySet.distinct 滚动到“注意”。只是在上面敲了一个小时,现在想应该已经清楚地阅读了文档。:) (2认同)

Jam*_*ley 8

有关"distinct()"函数,请参阅QuerySet API文档:

返回在其SQL查询中使用SELECT DISTINCT的新QuerySet.这样可以消除查询结果中的重复行.

默认情况下,QuerySet不会消除重复的行.实际上,这很少是一个问题,因为像Blog.objects.all()这样的简单查询不会引入重复结果行的可能性.但是,如果您的查询跨越多个表,则在评估QuerySet时可能会获得重复的结果.那就是你使用distinct()的时候.