在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')(但这显然不起作用)
答案 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和课程不正确)。