对子记录执行Django查询,但不获取重复行

2024-05-16 02:44:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个Django查询来查找一组包含某些子记录的父记录。问题是有两个子项匹配搜索的父记录将在结果中包含两次。在

我怎样才能让每个父母都有一次,即使它有多个匹配的孩子?在

下面我举了一个简单的例子来说明这个问题。Blog是父级,Entry是子级。当我搜索包含标题中带有“Hello”的条目的博客时,我得到了Jimmy博客的两个副本。在

以下是我创建的记录和我尝试的查询:

    b = Blog(name="Jimmy's Jottings")
    b.save()
    Entry(blog=b, headline='Hello, World!').save()
    Entry(blog=b, headline='Hello Kitty').save()

    blog_count = Blog.objects.filter(entries__headline__contains='Hello').count()
    assert blog_count == 1, blog_count

您可以看到只有一个blog,但是assert失败,计数为2。在

以下是完整的示例:

^{pr2}$

Tags: djangohellosavecount记录孩子blogassert
2条回答

诀窍是使用一个子查询来查找匹配子项的blog id,然后搜索在该子查询中具有id的所有blog。然后子查询可以有重复项,而不会在主查询中造成重复。在

以下是固定查询:

blog_ids = Entry.objects.filter(headline__contains='Hello').values('blog_id')
blog_count = Blog.objects.filter(id__in=blog_ids).count()
assert blog_count == 1, blog_count

以下是生成的SQL查询:

^{pr2}$

虽然我相信Don Kirby的响应是有效的,但我认为更好的解决方案是在queryset的末尾添加.distinct()。这只是从查询结果中消除任何重复行。SQL的等效方法是对给定查询使用SELECT DISTINCT。在

相关问题 更多 >