Пользовательское упорядочивание в Django

Ответ Ананда С. Кумара не округляется до ближайшей четверти часа, он обрезает минуты до ближайших 15 минут под ним.

На самом деле, в вашем примере 2015-07-18 13:53:33.280 следует округлить до 2015-07-18 14:00:00.000, поскольку 53:33.280 ближе к 60 минутам, чем к 45 минутам.

Я нашел более надежный ответ для округления в в этом посте .

Для вашей ситуации это должно работать:

import datetime

def round_time(time, round_to):
    """roundTo is the number of minutes to round to"""
    rounded = time + datetime.timedelta(minutes=round_to/2.)
    rounded -= datetime.timedelta(minutes=rounded.minute % round_to,
                                  seconds=rounded.second,
                                  microseconds=rounded.microsecond)
    return rounded

dt['dtcolumn'] = df['dtcolumn'].apply(lambda x: round_time(x))

30
задан Serjik 19 December 2015 в 08:05
поделиться

3 ответа

Насколько мне известно, нет никакого способа указать порядок на стороне базы данных таким образом, поскольку это было бы слишком специфично для серверной части. Возможно, вы захотите прибегнуть к старой доброй сортировке Python:

class Foo(models.Model):
    name = models.CharField(max_length=128)

Foo.objects.create(name='a10')
Foo.objects.create(name='a1')
Foo.objects.create(name='a2')

ordered = sorted(Foo.objects.all(), key=lambda n: (n[0], int(n[1:])))
print ordered # yields a1, a2, 10

Если вы обнаружите, что вам часто нужна такая сортировка, я бы порекомендовал создать собственный подкласс models.Manager для вашей модели, которая работает заказ. Примерно так:

class FooManager(models.Manager):
    def in_a_number_order(self, *args, **kwargs):
        qs = self.get_query_set().filter(*args, **kwargs)
        return sorted(qs, key=lambda n: (n[0], int(n[1:])))

class Foo(models.Model):
    ... as before ...
    objects = FooManager()

print Foo.objects.in_a_number_order()
print Foo.objects.in_a_number_order(id__in=[5, 4, 3]) # or any filtering expression
42
ответ дан 27 November 2019 в 23:25
поделиться

@ Ответ Джаррета (выполните сортировку на Python) отлично подходит для простых случаев. Если у вас есть большая таблица и вы хотите, скажем, вывести только первую страницу результатов, отсортированных определенным образом, этот подход не работает (вам нужно вытащить каждую строку из базы данных, прежде чем вы сможете выполнить сортировку). На этом этапе я хотел бы добавить денормализованное поле «сортировка», которое вы заполняете из поля «имя» во время сохранения, которое вы можете отсортировать на уровне БД обычным способом.

31
ответ дан 27 November 2019 в 23:25
поделиться

Это зависит от того, где вы хотите его использовать.

Если вы хотите использовать его в своих шаблонах, я бы предложил написать тег шаблона, который будет выполнять упорядочивание за вас. В нем вы можете использовать любой алгоритм сортировки, который хотите использовать.

В админке я выполняю настраиваемую сортировку, расширяя шаблоны в соответствии с моими потребностями и загружая тег шаблона, как описано выше

0
ответ дан 27 November 2019 в 23:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: