python - 如何在我的 Django 应用程序中集成排名算法
问题描述
我正在建立一个简单的黑客新闻网站,并希望获得有关如何为提交的帖子集成排名算法的帮助。
我知道我可以通过“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() 函数?
在此先感谢您的帮助!
解决方案
如果您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')
推荐阅读
- java - FindAllByColumn(列表
ElasticsearchRepository 中的 columnValues) 不起作用 - php - 带有 socket-io 的 Laravel 事件 [接收通知]
- r - r - 如何在阶梯式数据层次结构中填写值
- c# - 值不能为空。参数名称:尝试使用 web api 获取数据时的源
- azure-cosmosdb - 导入 CosmosDB 时出现 mongoimport 错误
- java - 根据 TableView javafx 的行更改的按钮图标
- excel - 在excel中条件格式设置多行
- php - php - 在根文件夹之外包含 html 页面
- python - How to update the progress bar value in a tkinter window from a Flask application which is in another thread?
- c# - 类构造函数:出现错误“名称在当前上下文中不存在”