Django ORM:带聚合函数的排序-无特殊处理

2024-04-19 11:13:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做这个问题:

SomeObject.objects.annotate(something=Avg('something')).order_by(something).all()

我通常在我的模型中有一个聚合字段,我使用Django信号来保持同步,但是在这种情况下,性能不是问题,所以我想我应该保持简单,只使用子查询。在

然而,这种方法带来了一个意想不到的问题。 如果聚合函数结果如下所示:

^{pr2}$

但是,如果您混入一些None,则其顺序如下:

[None, 5.0, 4.0 …]

问题是没有比任何数字都高的值,而它的值最多应该是0。在

我使用的是PostgreSQL,还没有测试过其他DBs。我还没有真正检查生成了什么查询等等

我只是在记忆里整理一下:

sorted(…, key=lambda _:_.avg_rating if _.avg_rating is not None else 0) 

所以我只是想知道有没有办法用Django ORM来做呢?也许.where?还是别的什么?在


Tags: django模型nonebyobjects信号情况order
1条回答
网友
1楼 · 发布于 2024-04-19 11:13:44

通过extra()添加has_something=1,0,然后对has_something和something进行排序,怎么样?在

with_avg = SomeObject.objects.annotate(avg=Avg('something'))
with_avg_and_has = with_avg.extra(select={'has_something': 'something is NULL'})
sorted_result = with_avg_and_has.order_by('-has_something', '-avg').all() 

严格意义上不是100%ORM,但它确实将排序推回到数据库中。在

相关问题 更多 >