在django中我的子查询的最佳方式

时间:2014-06-04 15:37:13

标签: python django orm

我是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中执行此操作的最佳方法是什么

1 个答案:

答案 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]