我正在建立一个简单的黑客新闻网站,希望对如何整合提交帖子的排名算法有所帮助。
我了解我可以通过“ 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()函数?
预先感谢您的帮助!
答案 0 :(得分:0)
如果您使用新的计算值annotate
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')
模型,所以我不知道这些是否是模型的真实字段):
void Qvideomedia::on_pushButton_clicked()
{
QVideoWidget* vw = new QVideoWidget();
QMediaPlayer* mp = new QMediaPlayer(vw);
QString vidstring = QFileDialog::getOpenFileName(this, "Select video file", QDir::homePath());
mp->setMedia(QUrl::fromLocalFile(vidstring));
mp->setVideoOutput(vw);
vw->setGeometry(100, 100, 500, 500); // you will have to change this
vw->setparent(this); // this is what you need ..
vw->show();
mp->play();
}