gpt4 book ai didi

python - 始终首先对 python Django 查询进行排序,其中零为先,然后是正数,然后是负数

转载 作者:太空宇宙 更新时间:2023-11-03 15:39:13 26 4
gpt4 key购买 nike

我将 Django 对象设置为:

class Example(models.Model):
count = models.CharField(default="0")

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

我正在查看的另一条路线如下所示:

objs = Example.objects.all()
sorted_objs = sorted(objs, key = lambda o: int(o.count))

有没有办法使用sorted方法先对0进行排序?我找不到。

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

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 字段的同时完成此操作。

最佳答案

您可以使用 case为订购目的添加一个新字段:

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。使用“新字段”,您可以将计数 = 0 的行集提高到顶部,然后在最后一组负数中提高一组正数。第二个字段 count 对每个集合进行升序排序。

免责声明:

请注意,这不是索引友好的解决方案!如果你需要性能,那么,只需在模型上创建这个新字段并在保存之前弄清楚它。

关于python - 始终首先对 python Django 查询进行排序,其中零为先,然后是正数,然后是负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53602865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com