Индивидуальный заказ по расчету в Джанго - PullRequest
1 голос
/ 12 апреля 2011

Какие-нибудь решения для сортировки пользовательских вычислений в Джанго?Я хочу создать представление, которое показывает Топ сообщений в моем блоге.Рейтинг будет рассчитываться по атрибутам поста.Скажем так, у меня есть 3 целых поля с именами x, y и z, и вычисление ранжирования будет x * y / z.

Есть идеи?Я хотел бы сделать Top Post когда-либо, а также другие варианты, отфильтрованные по времени, такие как последние 24 часа, 7 дней, 1 месяц и т. Д.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 12 апреля 2011

Вы можете использовать extra для извлечения дополнительных вычисленных столбцов и сортировки по ним:

MyModel.objects.filter(post_date__lt=#date#)
       .extra(select={'custom_order': "x*y/z"}).order_by('custom_order')

Проблема с этим подходом заключается в том, что вы пишете sql, поэтому он не всегда переносим между базами данных (хотя, для приведенного вами примера, эту проблему избегают, поскольку это простой расчет)

В противном случае вы можете выполнить сортировку на чистом питоне:

sorted_models = sorted(MyModel.objects.filter(post_date__lt=#date#)
                , key=lambda my_model:my_model.x*my_model.y/my_model.z))
0 голосов
/ 12 апреля 2011

Поскольку вы не можете упорядочить наборы запросов по методам и свойствам в django, вы должны выполнить сортировку в python.

Рассмотрите возможность преобразования вычисляемого поля в свойство в вашей модели, а затемВы можете сделать это в своем представлении:

sorted_posts = sorted(Post.objects.all(), key=lambda post: post.calculated_field )

Наконец, вы можете передать sorted_posts вашему списку-шаблону.

0 голосов
/ 12 апреля 2011

Метод extra () queryset должен позволить вам сделать это.См. документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...