如何按字母数字顺序排序django charfield

3
我有一个模型,我已经尝试使用 order_by('cell_name') 排序,但不是我想要的。我想根据 字母+数字 字段排序。您能否提供建议?任何帮助都将不胜感激。
#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')

my result:

cell_name
10a
10b
10c
11a
11b
1a
1b
2a
2b

我想要的结果:

1a
1b
2a
2b
10a
10b
11a
11b

1
请查看此问题/答案:这里 - Chiheb Nexus
2个回答

2
你可以手动对查询集进行排序:

最初的回答:

你可以手动对查询集进行排序:
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:])))

0
假设数据格式概述与一些数字后跟可选文本保持一致,您可以通过正则表达式将数据解析为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 by子句:
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。希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接