如何在Django应用程序中对访问次数进行排序?

2024-05-16 13:41:49 发布

您现在位置:Python中文网/ 问答频道 /正文

在Django(1.0.2)中,我有两个模型:Lesson和StatLesson。在

class Lesson(models.Model):
    contents = models.TextField()
    def get_visits(self):
        return self.statlesson_set.all().count()

class StatLesson(models.Model):
    lesson = models.ForeignKey(Lesson)
    datetime = models.DateTimeField(default=datetime.datetime.now())

每位参赛者登记一次参观某一节课。我可以用课程。让你参观()以获取该课程的访问次数。在

我怎样才能得到一个按访问次数排序的课程查询集?我在找这样的东西:Lesson.objects.all().order\u by('statlesson\uu count')(但这显然行不通)


Tags: django模型selfdatetimemodelmodelscountall
2条回答

您需要使用extra执行一些本机SQL操作。在

(非常粗略地)


Lesson.objects.extra(select={'visit_count': "SELECT COUNT(*) FROM statlesson WHERE statlesson.lesson_id=lesson.id"}).order_by('visit_count')

您需要确保SELECT COUNT(*) FROM statlesson WHERE statlesson.lesson_id=lesson.id具有项目的write db表名(因为statlesson和lesson不正确)。在

django1.1将提供聚合支持。在

在Django 1.0.x上,您可以使用一个额外的字段自动计数:

class Lesson(models.Model):
    contents = models.TextField()
    visit_count = models.IntegerField(default=0)

class StatLesson(models.Model):
    lesson = models.ForeignKey(Lesson)
    datetime = models.DateTimeField(default=datetime.datetime.now())

    def save(self, *args, **kwargs):
        if self.pk is None:
            self.lesson.visit_count += 1
            self.lesson.save()
        super(StatLesson, self).save(*args, **kwargs)

然后可以这样查询:

^{pr2}$

相关问题 更多 >