2015-06-01 62 views
1

我有兩個表。第一個是基本的用戶表。第二個是名爲Section的表格。Django ManyToMany反向查詢與特定鍵

def User(models.Model): 
    ... 
    is_teacher = models.BooleanField(default=False) 
    ... 

def Section(models.Model): 
    ... 
    teachers = models.ManyToManyField(User, related_name="teachers") 
    students = models.ManyToManyField(User, related_name="students") 
    is_active = models.BooleanField(default=True) 
    ... 

我想獲得所有的學生用戶(在用戶表中標識與is_teacher=False),我知道可以用User.objects.filter(is_teacher=False)輕鬆完成。

我想獲取每個用戶的活動部分。

但是,此刻,我似乎甚至無法獲得用戶的部分部分的集合。

我已經試過:

students = User.objects.filter(is_teacher=False) 
for s in students: 
    print s.section_set.all() 

但我發現了一個錯誤,User對象沒有section_set。我在猜測,因爲該部分與用戶表(教師和學生)有兩個多對多的關係,所以我可能必須更清楚地說明關係(跟隨學生而不是老師)。但我不知道如何做到這一點。

回答

1

當定義related_name值,請記住這一個名字向後關係(在你的情況 - 從UserSection)。因此,要保持你的代碼清晰和易於理解的,我建議你改變這樣的名字:

def Section(models.Model): 
    ... 
    teachers = models.ManyToManyField(User, related_name="sections_where_teacher") 
    students = models.ManyToManyField(User, related_name="sections_where_student") 
    is_active = models.BooleanField(default=True) 
    ... 

然後利用關係是這樣的:

print s.sections_where_student.all() 
+1

感謝。現在開始瞭解related_names字段的真正目的... – akajb

0

試試這個:

sec = Section.object.filter(students = students, is_active=True) 

你會得到誰是活躍學生的部分對象。

0

您已經定義related_name明確你的多對多領域,所以這是訪問你應該使用:

print s.students.all() 

不是說你用過沒有多大意義的實際名稱;反向關係不是「學生」,而是「作爲學生的章節」。