具有多个子查询的复杂django查询集注释

时间:2014-10-27 12:59:34

标签: django django-orm

以下是一些注释列表:

    count_set = {
        'num_followers': 'following_followinguser_leader',
        'num_followings': 'following_followinguser_follower',
    }

    for k, v in count_set.iteritems():
        qs = qs.annotate(**{k: models.Count(v, distinct=True)})
    return qs

我正在寻找添加all字段的解决方案,该字段将是num_followersnum_followings中的一些独特元素。

问题是应该足够快,最好的方法是纯SQL,但是django ORM怎么样?

UPD:以下

的PostgreSQL表架构
            Table "public.following_followinguser"
     Column      |           Type           |  Modifiers                               
-----------------+--------------------------+------------------------------
id               | integer                  | not null
follower_id      | integer                  | not null
leader_id        | integer                  | not null

关注者和领导者ID是从AbstractUser继承的自定义用户模型的链接。 following_followinguser_leader是上述模型的领导者字段的相关名称。

例如让关注者将成为具有ID的用户:1,2,3,用户4是具有ID 1,5,6的用户的追随者。比所有应该是:1,2,3, 5,6。我需要的只是数字,即5。

1 个答案:

答案 0 :(得分:1)

生成的SQL可能会像通过Django ORM一样紧密。您始终可以通过打印qs.query.sql_with_params()并查看生成的SQL来验证它。如果需要,可以在列中添加索引以加快计数(postgres 9.2 +)。