在Django ORM中使用“extra”子句时避免重复的select语句

时间:2015-03-18 15:16:55

标签: django postgresql python-3.x

我需要能够检索相关记录的总和以用于显示目的,并且还可以通过三个相关模型的计数总和来排序。目前,我通过使用" extra"来解决这个问题。子句:

results = Poll.visible.extra(
    select={
        'f_count':
        """
        SELECT COUNT('id') FROM polls_forecast
        WHERE polls_forecast.poll_id = polls_poll.id
        """,
        'total':
        """
        (SELECT COUNT('id') FROM polls_forecast
         WHERE polls_forecast.poll_id = polls_poll.id) +
        (SELECT COUNT('id') FROM polls_pollcomment
         WHERE polls_pollcomment.poll_id = polls_poll.id) +
        (SELECT COUNT('id') FROM polls_favoritedpoll
         WHERE polls_favoritedpoll.poll_id = polls_poll.id)
        """
    }
).order_by('-total')[:100]

是否可以对f_count进行别名,因此我不必在total选择语句中执行相同的计数?在f_count选择中引用total会引发"列不存在"错误。

我使用的是Postgres 9.4,Django 1.7.5,Python 3.4。

1 个答案:

答案 0 :(得分:1)

不使用.extra。您需要使用raw。以下是docs

如果您决定采用该路线,则必须在该原始SQL查询中执行visible中涉及的过滤器。与QuerySet相比,我对RawQuerySet提供的内容并不是100%肯定。

相关问题