我是Django ORM的新手,所以也许我的问题很简单。当我像这样创建我的查询时:
mostSaved = models.Rhyme.objects.all().annotate(saved_count=Count('profiles'), vote_strength=Sum('votes__strength')).order_by('-saved_count')[:6]
我的结果错误,因为vote_strengh被计算两次。我不知道如何在django的ORM中制作子查询。在postgres中,我的正确查询应该是这样的:
SELECT tab.id, SUM("frontsite_voterhyme"."strength") AS "vote_strength"
FROM(
SELECT
"frontsite_rhyme"."id", "frontsite_rhyme"."title", "frontsite_rhyme"."content", "frontsite_rhyme"."created", "frontsite_rhyme"."author_id", "frontsite_rhyme"."category_id",
COUNT("frontsite_rhyme_profiles"."userprofile_id") AS "saved_count"
FROM "frontsite_rhyme"
LEFT OUTER JOIN "frontsite_rhyme_profiles" ON ( "frontsite_rhyme"."id" = "frontsite_rhyme_profiles"."rhyme_id" )
GROUP BY "frontsite_rhyme"."id", "frontsite_rhyme"."title", "frontsite_rhyme"."content", "frontsite_rhyme"."created", "frontsite_rhyme"."author_id", "frontsite_rhyme"."category_id"
ORDER BY "saved_count"
DESC LIMIT 6
)tab
LEFT OUTER JOIN "frontsite_voterhyme" ON ( tab."id" = "frontsite_voterhyme"."rhyme_id" )
GROUP BY tab.id
在Django的ORM中执行此操作的最佳方法是什么
答案 0 :(得分:0)
您可以在distinct
上使用Count
参数。它没有记录,因此将来可能会在发布更改中没有通知的情况下发生变化。
mostSaved = models.Rhyme.objects.all().annotate(
saved_count=Count('profiles', distinct=True),
vote_strength=Sum('votes__strength')
).order_by('-saved_count')[:6]