加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在Django Queryset上自然排序

发布时间:2020-12-20 13:16:21 所属栏目:Python 来源:网络整理
导读:我正在开发一个系统,列出按产品代码排序的一系列产品.产品代码由两个字母组成,后跟一个数字,例如EG1. 我目前通过简单的方式对这些产品进行排序 Product.objects.order_by( ‘PRODUCT_CODE’), 但是,由于可以有多个数字的产品代码(例如EG12),这些代码将出现在
我正在开发一个系统,列出按产品代码排序的一系列产品.产品代码由两个字母组成,后跟一个数字,例如EG1.

我目前通过简单的方式对这些产品进行排序

Product.objects.order_by( ‘PRODUCT_CODE’),

但是,由于可以有多个数字的产品代码(例如EG12),这些代码将出现在单个数字代码之前.
即EG1,EG11,EG12,EG13 …… EG19,EG2,EG20等

我知道在产品代码中添加前导零将解决这个问题(即EG01而不是EG1),但由于已经有印刷文献和使用EG1的现有网站,因此这不是一个选项.

有没有办法解决这个问题,以正确的顺序显示这些产品?

解决方法

我认为这里的实施( https://github.com/nathforge/django-naturalsortfield)应该有效.这种方法的主要优点是它不在python中进行排序,而是在数据库中进行排序,因此即使在大型数据集上也能很好地执行,但需要额外的存储.

您必须更改模型以包含product_code__sort字段

class MyModel(models.Model):
    title = models.CharField(max_length=255)
    title_sort = NaturalSortField('title')

其中NaturalSortField定义为

class NaturalSortField(models.CharField):
    def __init__(self,for_field,**kwargs):
        self.for_field = for_field
        kwargs.setdefault('db_index',True)
        kwargs.setdefault('editable',False)
        kwargs.setdefault('max_length',255)
        super(NaturalSortField,self).__init__(**kwargs)

    def pre_save(self,model_instance,add):
        return self.naturalize(getattr(model_instance,self.for_field))

    def naturalize(self,string):
        def naturalize_int_match(match):
            return '%08d' % (int(match.group(0)),)

        string = string.lower()
        string = string.strip()
        string = re.sub(r'^thes+','',string)
        string = re.sub(r'd+',naturalize_int_match,string)

        return string

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读