#django #sorting
#django #сортировка
Вопрос:
Есть ли решения для сортировки пользовательских вычислений в Django? Я хочу создать представление, в котором отображаются лучшие записи в моем блоге. Рейтинг будет рассчитываться по атрибутам Post. Давайте просто скажем, что у меня есть 3 целых поля, называемых x, y и z, и вычисление ранжирования будет x * y / z.
Есть идеи? Я хотел бы сделать лучший пост за всю историю, а также другие варианты, отфильтрованные по времени, такие как последние 24 часа, 7 дней, 1 месяц и т.д.
Спасибо!
Ответ №1:
Вы можете использовать extra
для извлечения дополнительных вычисляемых столбцов и сортировки по ним:
MyModel.objects.filter(post_date__lt=#date#)
.extra(select={'custom_order': "x*y/z"}).order_by('custom_order')
Проблема с этим подходом заключается в том, что вы пишете sql, поэтому он не всегда переносим по базам данных (хотя в приведенном вами примере этой проблемы можно избежать, поскольку это простое вычисление)
В противном случае вы можете выполнить сортировку с помощью чистого python:
sorted_models = sorted(MyModel.objects.filter(post_date__lt=#date#)
, key=lambda my_model:my_model.x*my_model.y/my_model.z))
Комментарии:
1. Спасибо! Да, я думал о сортировке с помощью чистого Python, но я боялся, что это будет означать, что сначала будет сделан большой выбор, а затем отсортирован с помощью Python. Конечно, я могу быть совершенно неправ.
2. Конечно, выполнение сортировки в базе данных в большинстве случаев более эффективно, но для этого потребовалось бы написать
sql
инструкции (зависящие от базы данных). С другой стороны, сортировка с помощью python обеспечивает постоянный, независимый от базы данных рабочий код. Решение о том, какой из них выбрать, зависит от каждой ситуации (размер данных, время отклика, несколько серверных систем).
Ответ №2:
Метод extra() queryset должен позволить вам сделать это. Смотрите документы
Комментарии:
1. Обновите документы docs.djangoproject.com/en/dev/ref/models/querysets /…
2. Обновлено с помощью новой ссылки
Ответ №3:
Поскольку вы не можете упорядочивать наборы запросов по методам и свойствам в django, вам придется выполнять сортировку на python.
Подумайте о том, чтобы превратить ваше вычисляемое поле в свойство вашей модели, и тогда вы сможете сделать это в своем представлении:
sorted_posts = sorted(Post.objects.all(), key=lambda post: post.calculated_field )
Наконец, вы можете перейти sorted_posts
к вашему списку-шаблону.