如何在我的Django应用程序中集成排名算法

时间:2019-05-20 13:10:25

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

我正在建立一个简单的黑客新闻网站,希望对如何整合提交帖子的排名算法有所帮助。

我了解我可以通过“ 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 :(得分: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();
}