在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),这些代码将出现在单个数字代码之前. 我知道在产品代码中添加前导零将解决这个问题(即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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |