проблема сортировки джанго - PullRequest
2 голосов
/ 08 мая 2019

У меня есть документ, который состоит из разделов, подразделов и предложений.

Section 1
Subsections 1.1, 1.2, 1.3
Clauses 1.1.1, 1.1.2... 1.2.1, 1.2.2...

Это модели, в которых есть поле «число» для хранения идентификатора, но это поле CharField из-за синтаксиса двойной точки в некоторых подразделах и предложениях, например ...

Clause 1.2.1

Если я хочу отсортировать подразделы, базовый алгоритм сортировки Django будет сортировать:

1.1
1.2
1.3
...

Но это становится проблематичным, когда у меня в группе более 9 подразделов или предложений, потому что сортировка дает мне:

1.1
1.10
1.11
1.2
1.3
...

Есть ли способ правильно упорядочить их в шаблоне, например:

1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11 

Я мог бы преобразовать их в числа с плавающей точкой, а затем отсортировать их - но это не сработало бы для предложений.

models.py

 class Section(models.Model):
     number = models.CharField(max_length=2, unique=True)
     name = models.CharField(max_length=150, unique=False)
     descriptor = HTMLField(blank=True)

     def __str__(self):
         return u'%s %s' % (self.number, self.name)
     ...

 class Subsection(models.Model):
     number = models.CharField(max_length=5, unique=True)
     name = models.CharField(max_length=150, unique=False)
     descriptor = HTMLField(blank=True)
     fundamental = models.BooleanField()
     section = models.ForeignKey(Section, on_delete=models.DO_NOTHING)

     def __str__(self):
         return u'%s %s' % (self.number, self.name)

     class Meta:
         ordering = ["number"]
     ....

class Clause(models.Model):
    number = models.CharField(max_length=8, unique=True)
    requirements = HTMLField()
    audit_part = models.CharField(max_length=64, choices=AUDIT_CHOICES)
    subsection = models.ForeignKey(Subsection, on_delete=models.DO_NOTHING)
    compliance_level = models.CharField(max_length=64, choices=LEVEL_CHOICES, blank=True, null=True)

    def __str__(self):
        return u'%s' % (self.number)

    class Meta:
        ordering = ["number"]
    ...

1 Ответ

2 голосов
/ 08 мая 2019

Вот один из подходов к такой сортировке

from distutils.version import StrictVersion
subs = list(Subsection.objects.all().values_list("number", flat=True))
subs.sort(key=StrictVersion)
print subs

Предполагая, что subs было ["1.1", "1.10","1.11","1.2","1.3"]

Это должно дать вам ['1.1', '1.2', '1.3', '1.10', '1.11']


Для сортировки набора запросов

subs = Subsection.objects.all()
result = sorted(subs, key=lambda x: StrictVersion(x.number))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...