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

#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 к вашему списку-шаблону.