2016-09-10 19 views
0

我有一大堆的模型,通過用戶模型相關的:settings.AUTH_USER_MODELDjango的:過濾基於3步外鍵連接上的查詢集

模型1:

class Submission(models.Model): 
    ... 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 

模型2:

class Block(models.Model): 
    ... 
    current_teacher = models.ForeignKey(settings.AUTH_USER_MODEL) 

模型3:

class CourseStudent(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    block = models.ForeignKey(Block) 
    ... 

給定兩個用戶BLock模型中有一個是teacher,另一個是其他兩個模型中的student用戶,我怎樣才能得到提交的查詢集,其中: (道歉,我正在努力如何做到最好描述這個)

  • CourseStudent.user = Submission.user
  • CourseStudent.block是具有current_teacher =老師

換句話說,塊之一:教師的教特定塊,學生課程在這些塊中。學生提交工作。教師只希望看到學生在他們(老師的)塊中提交的作品。

我想通過用戶提交的所有文件,其中用戶 - > CourseStudent - >塊 - > current_teacher,對於給定的老師。

+0

你想要老師下的用戶提交的所有提交? –

+0

我想要一個給定教師的用戶提交的所有提交,其中用戶 - > CourseStudent - > block - >教師。 – 43Tesseracts

+0

是的,以及如何判斷用戶是否在老師之下是通過查看塊。 – 43Tesseracts

回答

1

我認爲你正在尋找:

Submission.objects.filter(user__coursestudent__block__current_teacher=teacher).distinct() 

開始時你有你想要的東西(「查詢集的Submissions」),然後跨過關係工作方式。 distinct()的目的是爲了擺脫重複的結果。 (例如,如果用戶在兩個不同的塊中具有相同的教師,則Submission將在沒有它的情況下出現兩次)。

+0

感謝您的解釋,這一定會在未來幫助我。這是外鍵逆轉(在這種情況下爲'user__coursestudent'),我很難直覺。 – 43Tesseracts

0

我認爲你需要Block和Submission之間的另一個關係,因爲正如你所說的只有學生提交。所以如果你過濾用戶 - > CourseStudent - > block - > current_teacher,那麼你會得到'教師'的提交,不是嗎?或者我錯過了一些東西。