【问题标题】:How to integrate a ranking algorithm in my Django application如何在我的 Django 应用程序中集成排名算法
【发布时间】:2019-05-20 13:10:25
【问题描述】:

我正在构建一个简单的黑客新闻网站,希望获得有关如何为提交的帖子集成排名算法的帮助。

我知道我可以通过“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() 函数?

提前感谢您的帮助!

【问题讨论】:

标签: python django python-3.x django-models django-views


【解决方案1】:

如果您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')

【讨论】:

  • 感谢您的回复。您能否指导我查看一些文档,以便我进行调查?
  • 我已经修正了我的答案,以便它实际上可以从日期差中减去投票计数(整数值):ExtractDay 返回整数天数。
最近更新 更多