我有下面的一个模型,我已经尝试了order_by('cell_name'),但与我想要的不一样。我想要基于alphabet+number字段的订单。请您对此提出建议,如有任何帮助,将不胜感激。
#my model
class BuildingCell(models.Model):
....
cell_name = models.CharField(max_length=100, blank=True, null=True)
#my queryset
q1 = BuildingCell.objects.all().order_by('cell_name')我的结果:
cell_name
10a
10b
10c
11a
11b
1a
1b
2a
2b我想要的结果:
1a
1b
2a
2b
10a
10b
11a
11b发布于 2019-08-10 14:07:19
您可以手动对查询集进行排序:
q1 = BuildingCell.objects.all()
q1 = sorted(list(q1),key=lambda s:list(map(lambda x:int(x) if x.isdigit() else x,re.split(r'(\d+)',s.name)[1:])))发布于 2019-08-10 17:46:49
假设数据格式大纲与一定数量的数字和可选文本相一致,则可以通过正则表达式将数据解析为2个字段,并将结果字段直接排序为SQL语句。
with test_data (cell_name) as
( values ('10a')
, ('10b')
, ('10c')
, ('11a')
, ('11b')
, ('1a')
, ('1b')
, ('2a')
, ('2b')
, ('20') -- added
, ('20b') -- added
, ('ABC') -- Use only for no leading digits passibility
)
select cell_name
from test_data
order by
regexp_replace (cell_name, '^(\d+)(\D?.*)','\1')::integer
, regexp_replace (cell_name, '^(\d+)(\D?.*)','\2')
; 如果条目可能没有前导位,则展开order子句:
select cell_name
from test_name
order by
case when cell_name ~ '^(\d+)'
then regexp_replace (cell_name, '^(\d+)(\D?.*)','\1')::integer
else null::integer
end
, case when cell_name ~ '^(\d+)'
then regexp_replace (cell_name, '^(\d+)(\D?.*)','\2')
else cell_name
end ; 转换到适当的Django/Python结构,我必须留给您,因为我不知道Django和小Python。希望这能有所帮助。
https://stackoverflow.com/questions/57440192
复制相似问题