我将 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))
有没有办法使用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
对每个集合进行升序排序。
免责声明:
请注意,这不是索引友好的解决方案!如果你需要性能,那么,只需在模型上创建这个新字段并在保存之前弄清楚它。
我是一名优秀的程序员,十分优秀!