首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用alphabetical+numeric订购django charfield

如何用alphabetical+numeric订购django charfield
EN

Stack Overflow用户
提问于 2019-08-10 07:20:43
回答 2查看 732关注 0票数 2

我有下面的一个模型,我已经尝试了order_by('cell_name'),但与我想要的不一样。我想要基于alphabet+number字段的订单。请您对此提出建议,如有任何帮助,将不胜感激。

代码语言:javascript
复制
#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')

我的结果:

代码语言:javascript
复制
cell_name
10a
10b
10c
11a
11b
1a
1b
2a
2b

我想要的结果:

代码语言:javascript
复制
1a
1b
2a
2b
10a
10b
11a
11b
EN

回答 2

Stack Overflow用户

发布于 2019-08-10 14:07:19

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

代码语言:javascript
复制
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:])))
票数 1
EN

Stack Overflow用户

发布于 2019-08-10 17:46:49

假设数据格式大纲与一定数量的数字和可选文本相一致,则可以通过正则表达式将数据解析为2个字段,并将结果字段直接排序为SQL语句。

代码语言:javascript
复制
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子句:

代码语言:javascript
复制
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。希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57440192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档