在Django中查询数据库两个字段的总和,排序错误

1 投票
1 回答
1586 浏览
提问于 2025-04-17 06:51

我有一个对象,这个对象里保存了在推特和脸书上的连接数量。现在我想根据推特和脸书的连接总和来给这些对象排序,使用的是.extra这个字段。

不过,有些推特和脸书的字段是空的(也就是None),所以它们的总和就变成了空白。这导致了一些问题,因为这些空白的对象会被排在最前面。有没有办法让这些空白的字段在排序时当作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]

1 个回答

0

这个还没有测试过,不过你能这样做吗?

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]

撰写回答