【问题标题】:Query database in Django for sum of two fields, sorting wrong在Django中查询数据库中两个字段的总和,排序错误
【发布时间】:2011-11-22 18:57:13
【问题描述】:

我有一个对象,该对象的表中保存了 twitter 和 facebook 中的连接计数。我正在尝试使用 .extra 字段通过 facebook 和 twitter 计数的总和对这些对象的列表进行排序。

一些 twitter / facebook 字段为空(无),因此组合为空白。这导致了一些问题,这些空白的首先被排序。有没有办法让这些空白字段像 0 一样排序?

pages = Page.objects.filter(
    setup_complete=1, active=1
).exclude(
    Q(background_image__isnull=True) | Q(background_image__exact='')
).extra(
    select={'total_count':'twitter_count + facebook_count'},order_by=['-total_count']
)[:99]

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

    这个没有测试,但是你能做到吗?

    annotate(total_count=Sum(twitter_count) + Sum(facebook_count))
    

    如果没有,您可能需要在模型中执行此操作。例如,在模型中添加一个

    def get_total(self):
        if twitter_count == None and facebook_count == None:
            return 0
        elif twitter_count != None and facebook_count != None:
            return twitter_count + facebook_count
        elif twitter_count != None:
            return twitter_count
        else:
            return facebook_count
    total_count = property(get_total)
    

    然后在您的查询中:

    pages = Page.objects.filter(
        setup_complete=1, active=1
    ).exclude(
        Q(background_image__isnull=True) | Q(background_image__exact='')
    ).annotate(
        total_count=Sum(total)
    ).order_by=('-total')
    )[:99]
    

    【讨论】:

    • 我不确定我是否理解。我在 Page 表中有两个整数字段。我想 order_by 这些字段的总和。你能扩展我如何使用 annotate() 吗?没有看到与 extra() 相同的用途
    • 这给了我一个 FieldError 无法将关键字“total_count”解析到字段中。 (我在注释区把total改为total_count,因为我不知道total从哪里来)
    • 对于第一个 Sum + Sum 建议,我收到此错误:+: 'Sum' and 'Sum' 的操作数类型不受支持
    • annotate(total_count=Sum(twitter_count + facebook_count)) 呢?
    • 或者,你还能像这样使用 extra():.extra( select={'total_count':'Sum(twitter_count + facebook_count)'},order_by=['-total_count'] )
    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2018-05-12
    • 2012-12-20
    • 2018-12-08
    • 2019-01-04
    相关资源
    最近更新 更多