如何对Django app中的访问次数进行排序?

时间:2009-06-26 09:46:50

标签: python django

在Django(1.0.2)中,我有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())

每个StatLesson都会注册1次访问某个课程。我可以使用lesson.get_visits()来获取该课程的访问次数。

如何获取课程查询集,按访问次数排序?我正在寻找类似这样的东西:Lesson.objects.all()。order_by('statlesson__count')(但这显然不起作用)

2 个答案:

答案 0 :(得分:2)

Django 1.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)

然后你可以像这样查询:

Lesson.objects.all().order_by('visit_count')

答案 1 :(得分:1)

您需要使用extra来完成一些原生SQL内容。

e.g。 (非常粗略)


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具有项目的写入db表名称(因为statlesson和课程不正确)。