鉴于以下模型:
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(...)”会多次返回相同的Blog对象。
如何删除重复项?或者更好的是,我错过了将匹配列表传递给模板的更简单方法吗?
答案 0 :(得分:18)
添加.distinct()
只能获得截然不同的结果。
答案 1 :(得分:8)
请参阅QuerySet API Docs了解“distinct()”函数:
返回一个使用的新QuerySet 在其SQL查询中选择DISTINCT。这个 消除了重复的行 查询结果。
默认情况下,QuerySet不会 消除重复的行。在实践中, 这很少是一个问题,因为 简单的查询,如 Blog.objects.all()不介绍 重复结果行的可能性。 但是,如果您的查询跨越多个 表,可能会重复 评估QuerySet时的结果。 那就是你使用distinct()。