私は、製品コードでソートされた一連の製品をリストするシステムに取り組んでいます。製品コードは、EG1のように、2文字の後に数字が続くもので構成されています。
私は現在、これらの製品を簡単な方法で分類しています
Product.objects.order_by('product_code')
、
ただし、複数桁の製品コード(EG12など)が存在する可能性があるため、これらは1桁のコードよりも上に表示されます。すなわち、EG1、EG11、EG12、EG13 ... EG19、EG2、EG20など
製品コードに先行ゼロを追加するとこれが修正されることを知っています(つまり、EG1ではなくEG01)が、すでに印刷された文献と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'^the\s+', '', string)
string = re.sub(r'\d+', naturalize_int_match, string)
return string
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加