2009-06-26 60 views
2

在Django(1.0.2)中,我有2個模型:Lesson和StatLesson。如何排序Django應用程序中的訪問次數?

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註冊一個教程的一次訪問。我可以使用lesson.get_visits()獲取該課程的訪問次數。

如何獲取課程的查詢集,按訪問次數排序?我正在尋找像這樣的東西:Lesson.objects.all()。order_by('statlesson__count')(但這顯然不起作用)

回答

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') 
+0

你的意思是你不能_natively_在Django中直到1.1(當聚合支持到達時) - 它仍然可能在1.0中,只是不夠整齊。 – 2009-06-26 13:05:37

1

你需要使用做一些本地的SQL東西extra

例如(很不客氣)

 

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有你的項目寫入數據庫表名(如statlesson和教訓不會是正確的)。

相關問題