pyt*_*ity 5 python django python-3.x
我将 Django 对象设置为:
class Example(models.Model):
count = models.CharField(default="0")
Run Code Online (Sandbox Code Playgroud)
因此,如果我有一些对象ex1
, ex2
, ex3
,ex4
它们的计数分别为 -1、0、5、-6。我希望能够查询对象并将它们排序为[0, 5, -6, -1]
任何零首先出现的顺序,然后是正数,然后是负数,同时每个部分也按升序排列。我正在考虑使用类似的东西,Example.objects.order_by('count')
但没有找到一种方法来使用像这样的自定义函数来做到这一点。
我正在查看的另一条路线如下所示:
objs = Example.objects.all()
sorted_objs = sorted(objs, key = lambda o: int(o.count))
Run Code Online (Sandbox Code Playgroud)
有没有办法使用 sorted 方法先对零进行排序?我无法找到一个。
我使用的最后一种方法是:
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)
Run Code Online (Sandbox Code Playgroud)
这有效,但似乎不是最好的方法,所以任何想法都会很棒。作为旁注,我知道 count 属性最好存储为整数字段,但我想在将其保留为字符字段的同时完成此操作。
您可以使用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')
Run Code Online (Sandbox Code Playgroud)
解释:
订单子句将由以下两者组成:“新字段”,count
. 使用“新字段”,您可以将 count = 0 的行集提升到顶部,然后将正数集提升到最后一组负数。第二个字段 ,count
对每个集合进行升序排序。
免责声明:
请注意,这不是一个索引友好的解决方案!如果您需要性能,那么只需在模型上创建这个新字段并在保存之前弄清楚它即可。
归档时间: |
|
查看次数: |
313 次 |
最近记录: |