2009-06-26 5 views
2

Django(1.0.2)では、LessonとStatLessonという2つのモデルがあります。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は、特定のレッスンの1回の訪問を登録します。 lesson.get_visits()を使用して、そのレッスンの訪問数を取得できます。

レッスンのクエリセットを取得するには、訪問数でソートします。 Djangoの1.1集計をサポートしていますLesson.objects.all()ORDER_BY( 'statlesson__count')(ただし、これは明らかに動作しません)

答えて

2

:。私はこのような何かを探しています。

あなたは余分なフィールドを自動的にカウントすることができます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

Djangoで1.1まで(ネイティブサポートが到着したとき)_natively _できないことを意味します.1.0でも可能ですが、ちょうど整頓ではありません。 –

+0

@ジョンモンゴメリー、そうです。答えを修正しました。 – muhuk

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と教訓として、右ではありません)、プロジェクトの書き込みdbテーブル名を持っていることを確認する必要があります。

関連する問題