Как интегрировать алгоритм ранжирования в моем приложении Django - PullRequest
0 голосов
/ 20 мая 2019

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

Я понимаю, что могу ранжировать отправленные сообщения через 'order_by', что я и сделална данный момент:

def index(request):
    submitted_items = Submission.objects.all().order_by('-votecount')[:20]

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

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

class HomeView(TemplateView):
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        ctx = super(HomeView, self).get_context_data(**kwargs)

        now = timezone.now()
        submissions = Link.objects.all()
        for submission in submissions:
            num_votes = submission.upvotes.count()
            num_comments = submission.comment_set.count()

            date_diff = now - submission.submitted_on
            number_of_days_since_submission = date_diff.days

            submission.rank = num_votes + num_comments - number_of_days_since_submission

        sorted_submissions = sorted(submissions, key=lambda x: x.rank, reverse=True)
        ctx['submissions'] = sorted_submissions

        return ctx

Но я не мог заставить это работать в моем собственном приложении.

Думаю, еще один способ сформулировать мой вопрос - это.Django / Python имеет стандартную функцию order_by (), которая позволяет мне сортировать данные, проще всего в порядке возрастания или убывания.Есть ли способ создать мою собственную уникальную пользовательскую функцию order_by (), которую я могу использовать?

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 20 мая 2019

Если вы annotate ваш QuerySet с новым вычисленным значением, вы можете упорядочить по этому значению.Например (вы не показываете свою Submission модель, поэтому я не знаю, являются ли они настоящими полями вашей модели):

from django.db.models import F
from django.db.models.functions import ExtractDay
from django.utils import timezone

today = timezone.now().date
Submission.objects.annotate(rank=F('votecount') - ExtractDay(today - F('date')).order_by('-rank')
...