我在做这个问题:
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
?还是别的什么?在
通过extra()添加has_something=1,0,然后对has_something和something进行排序,怎么样?在
严格意义上不是100%ORM,但它确实将排序推回到数据库中。在
相关问题 更多 >
编程相关推荐