2017-02-25 8 views
0

モデルを次のように設定しました。各レッスンは章に属し、所有者がいます。各章について、ユーザーがUserChapterScoreテーブルに格納されているスコアを持っている別のモデルの多対多の関係でクエリーセットを注文する

from django.db import models 

class User(models.Model): 
    name = models.TextField() 

class Chapter(models.Model): 
    name = models.TextField() 

class Lesson(models.Model): 
    chapter = models.ForeignKey(Chapter) 
    owner = models.ForeignKey(User) 
    name = models.TextField() 

class UserChapterScore(models.Model): 
    chapter = models.ForeignKey(Chapter) 
    user = models.ForeignKey(User) 
    score = models.IntegerField(default=0) 

どのように私は、所有者の章スコア順の章に属する教訓を取得することができますか?

EDIT:必要に応じてM2M換算してください。私はあなたがそれぞれそれができ、更新

from django.db import models 

class Chapter(models.Model): 
    name = models.TextField() 

    def get_lessons(self): 
     """return all lessions filtered by specific chapter""" 
     return Lesson.objects.filter(chapter__pk=self.pk) 


class Lesson(models.Model): 
    chapter = models.ForeignKey(Chapter) 
    owner = models.ForeignKey(User) 
    name = models.TextField() 

    def get_user_chapters(self): 
     """return all chapters by specific `chapter` and `user` in this lession""" 
     return UserChapterScore.objects.filter(chapter=self.chapter, user=self.owner) 

    def get_user_scores(self): 
     """return total scores by specific `chapter` and `user` in this lession""" 
     return self.get_user_chapters().aggregate(models.Sum('score'))['score__sum'] 


class UserChapterScore(models.Model): 
    chapter = models.ForeignKey(Chapter) 
    user = models.ForeignKey(User) 
    score = models.IntegerField(default=0) 

...もちろん、モデルの構造

+0

つの質問:1.ユーザーのスコアは、各章のためのユニークなのですか? 2.各レッスンのスコアがある方が良いですし、そのレッスンスコアの合計はチャプターですか? –

+0

1.はい、ユーザースコアは各章ごとにユニークです2. 1レッスンのスコアはOKですが、その場合はその章のそのユーザーに属するすべてのレッスンの集計スコアを使用してレッスンを注文する必要があります – Bitonator

+0

だから、私がレッスンスコアを見ることができるのは、チャプタースコアよりも優れています。次に、ユーザースコア順にレッスンに使用する集約を実行できます。右?教えてください。私は答えを更新します。 –

答えて

0

を説明するためにモデルを使用し、あなたはこれを試すことができますすることができます。

lessons = [{ 
    'lessons': chapter.get_lessons(), # return queryset of lessons 
    'lessons_detail': [ 
     { 
      'owner': c.owner, 
      'scores': c.get_user_scores(), 
      'chapters': c.get_user_chapters() 
     } for c in chapter.get_lessons() 
    ] 
} for chapter in Chapter.objects.all()] 
+0

オーナーのチャプタースコアでソートされたレッスンを取得するためのクエリは表示されません – Bitonator

+0

私の更新プログラムを参照してください..何かのようなもの? –

0

backward relationshipsのためには、関連するモデルを取得するために<lowercase_related_model_name>_setを使用することができます。あなたの例では、これを試すことができます:

Lesson.objects.fitler(chapter=chapter).order_by('chapter__userchapterscore_set__score') 
0

これは私が思ったよりも簡単でした。私はLessonUser

  • レッスンの章では、私は
  • リストは、授業の所有者IDとユーザIDがUserLessonテーブル
  • に参加する対象の章であるようなUserChapterScore間の結合に必要UserChapterScoreテーブルの章は、リストを希望する章と同じでなければなりません。
  • UserChapterScoreテーブルとUserテーブルは両方のテーブルのユーザIDで結合します。

クエリーセットフィルタで二重アンダースコア表記を使用すると、Djangoが認識しませんでした。

また、UserChapterScoreテーブルの逆アクセサは、外部キーの場合には、Userモデルにおけるuserchapterscoreとして存在します。

最終クエリは次のとおりです。

Lesson.objects.filter(chapter=chapter, owner__userchapterscore__chapter=chapter).order_by('owner__userchapterscore__score)