我将Django对象设置为:
class Example(models.Model):
count = models.CharField(default="0")所以如果我有一些对象ex1,ex2,ex3,ex4,它们的计数分别为-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))有没有一种方法可以使用排序方法先对零进行排序?我找不到一个。
我使用的最后一种方式是:
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字段的情况下实现这一点。
发布于 2018-12-04 06:46:47
您可以使用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。使用"new field“,您可以将count =0的一组行提升到顶部,然后在最后一组负数上提升一组正数。第二个字段count对每个集合进行升序排序。
免责声明:
请注意,这不是一个索引友好的解决方案!如果您需要性能,那么,只需在model上创建这个新字段,并在保存之前找出它。
https://stackoverflow.com/questions/53602865
复制相似问题