2017-02-25 12 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) 

我怎樣才能找回屬於一章的經驗教訓,通過主人的章節分值排序?

編輯:如果需要,請轉換爲M2M等效。我使用的模型來說明模型

+0

兩個問題:(1)用戶得分是每章的獨特之處? 2.或者最好每個課程都有一個分數,而這個分數是所有課程分數的總和? –

+0

1.是的,每個章節的用戶評分是獨一無二的,2.每堂課的評分是可以的,但在這種情況下,該章節中屬於該用戶的所有課程的總分必須用於訂購課程 – Bitonator

+0

所以,我所看到的課程成績比章節成績要好。然後,您可以根據用戶分數順序進行聚合以用於課程。對?告訴我,我會更新我的答案。 –

回答

0

當然可以,你可以用這個嘗試的結構...

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) 

更新,你可以在每次;

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

這比我想象的要簡單。我需要LessonUserUserChapterScore等之間的連接是

  • 教訓的章節是我想要的清單
  • 教訓所有者ID和用戶ID加入UserLesson表本章
  • UserChapterScore表的章節應該是一樣的,我想在列表
  • UserChapterScore表和User表通過兩個表中的用戶ID加入的章節。

我沒有意識到Django在查詢集過濾器中使用雙下劃線表示法時會這樣做。

而且,在外鍵的情況下,UserChapterScore表的反向存取器在User模型中存在爲userchapterscore

最後的查詢是:

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