2012-01-19 17 views
2

在我的模型中,我爲用戶(他們是學生或教師 - 我有一個連接到auth.User的UserProfile表),一個課程表以及一個名爲enrollment的表,用於記錄哪些學生已註冊哪些課程。我的models.py如下:在Django中,如何執行以下多對多查詢(使用直通表)?

class Course(models.Model): 
    name  = models.CharField(max_length=40) 
    instructor = models.ForeignKey(UserProfile, related_name="Instructor") 
    students = models.ManyToManyField(UserProfile, through='Enrollment') 

class UserProfile(models.Model): 
    user  = models.OneToOneField(User, primary_key=True) 
    role  = models.CharField(max_length=4, choices=ROLE_CHOICES) # 'stud' or 'inst' 

class Enrollment(models.Model): 
    course = models.ForeignKey(Course) 
    student = models.ForeignKey(UserProfile) 

對於給定的用戶,我想找到的所有課程小號,他在就讀/我怎樣才能做到這一點?

此外,我在哪裏可以找到如何在Django中執行查詢的詳細說明,最好有大量緩慢增加複雜性的示例?

回答

2

如果不是一個User比如你從User實例有username場,你可以做到以下幾點:

courses = Course.objects.filter(students__user__username='thespecificusername') 

你構建的情景非常相似,這裏所討論的一個:https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

+0

我試過這個,但得到以下錯誤:'無法解析關鍵字'user_username'到字段中。選擇是:教師,課程,招生,筆記,角色,studentanswer,用戶這些選項中的一些特定於我的模型中的細節,我忽略了上述問題。 – Deonomo

+0

看起來像@Alasdair修復了用戶和用戶名之間缺少的下劃線。謝謝。 – sgallen

+0

非常感謝。顯然,我需要對這個主題的文檔進行深入的研究。 – Deonomo

3

如果你有UserProfile實例user_profile,然後嘗試:

courses = Course.objects.filter(students=user_profile) 

,如果你有一個User實例user,那麼你可以使用雙下劃線符號。

courses = Course.objects.filter(students__user=user) 

有關說明,我將從django文檔開始爲Making queries。其他人可能會有其他建議。另外:在這種情況下,除非您使用的是傳統數據庫,否則您並不需要明確定義連接表Enrollment,因爲您尚未定義任何額外字段。

+0

非常感謝。如果我沒有明確定義註冊表,那麼我將無法使用管理區域向學生註冊課程嗎? – Deonomo

+0

如果您未明確定義註冊表,您可以在「課程管理」中將學生添加到課程中。默認的小部件不是很方便,所以你可以設置['filter_horizo​​ntal'](https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.filter_horizo​​ntal)或['filter_vertical'](https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.filter_vertical)。你也可以檢查[多對多內聯](https://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-many-to-many-models)。 – Alasdair

+0

非常感謝。我現在繼續閱讀文檔。 – Deonomo