首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对python Django查询进行排序,始终先排序0,然后是积极项,最后是否定项

对python Django查询进行排序,始终先排序0,然后是积极项,最后是否定项
EN

Stack Overflow用户
提问于 2018-12-04 06:23:14
回答 1查看 336关注 0票数 5

我将Django对象设置为:

代码语言:javascript
运行
复制
class Example(models.Model):
    count = models.CharField(default="0")

所以如果我有一些对象ex1ex2ex3ex4,它们的计数分别为-1,0,5,-6。我希望能够查询对象并将它们按顺序[0, 5, -6, -1]排序,其中任何零都在前面,然后是正数,然后是负数,同时还按升序排列每个部分。我正在考虑使用像Example.objects.order_by('count')这样的东西,但是没有找到使用像this这样的自定义函数的方法。

我正在研究的另一条路线类似于下面的内容:

代码语言:javascript
运行
复制
objs = Example.objects.all()
sorted_objs = sorted(objs, key = lambda o: int(o.count))

有没有一种方法可以使用排序方法先对零进行排序?我找不到一个。

我使用的最后一种方式是:

代码语言:javascript
运行
复制
objs = Example.objects.all()
zero_objs = []
positive_objs = []
negative_objs = []
for obj in objs:
    if obj.count == 0:
        zero_objs.append(obj)
    elif obj.count < 0:
        negative_objs.append(obj)
    else:
        postitive_objs.append(obj)
sorted_objs = zero_objs + sorted(postitive_objs) + sorted(negative_objs)

这是可行的,但似乎不是最好的方式,所以任何想法都是很好的。顺便说一句,我知道count属性最好存储为整型字段,但我希望在保持其为char字段的情况下实现这一点。

EN

回答 1

Stack Overflow用户

发布于 2018-12-04 06:46:47

您可以使用case添加新字段以进行排序:

代码语言:javascript
运行
复制
from django.db.models import Case, IntegerField, Value, When
Example.objects.annotate(
    o=Case(
        When(count=0, then=Value(0)),
        When(count__gt=0, then=Value(1)),
        When(count__lt=0, then=Value(2)),
        output_field=IntegerField(),
    ),
).order_by('o', 'count')

说明:

Order子句将由以下两部分组成:“新字段”,count。使用"new field“,您可以将count =0的一组行提升到顶部,然后在最后一组负数上提升一组正数。第二个字段count对每个集合进行升序排序。

免责声明:

请注意,这不是一个索引友好的解决方案!如果您需要性能,那么,只需在model上创建这个新字段,并在保存之前找出它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53602865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档