2012-01-19 6 views
2

私のモデルでは、学生用のテーブル(学生やインストラクター - 私はauth.Userに接続されているUserProfileテーブルを持っています)、コース用のテーブル、およびenrollmentというテーブルがあります。どのコース。次のように私のmodels.pyがされています。Djangoでは、(throughテーブルを使用して)以下の多対多クエリを実行するにはどうすればよいですか?

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) 

を与えられたユーザーのために、私は私がこれをどのように操作を行うことができ、S /彼はに登録されたすべてのコースを見つけたいですか?

また、Djangoでどのようにクエリを実行するかについての詳細な説明はどこにありますか?複雑な例が徐々に増えています。

答えて

2

代わりに、あなたは次のことを行うことができUserインスタンスからusernameフィールドを持っているUserインスタンスの場合:

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 'をフィールドに解決できません。選択肢は次のとおりです:インストラクター、コース、登録、メモ、役割、学生の答え、ユーザー 'これらのオプションのいくつかは、上記の質問から除外したモデルの詳細に特有のものです。 – Deonomo

+0

@ Alasdairのように、ユーザーとユーザー名の間にアンダースコアがありません。ありがとう。 – sgallen

+0

ありがとうございます。明らかに、私はこの主題に関する文書を深く勉強する必要があります。 – Deonomo

3

あなたはUserProfileインスタンスuser_profileを持っている場合は、試してください:あなたはUserインスタンスuserを持っている場合

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

、あなたは二重のアンダースコア表記を使用することができます。説明のために

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

、私はMaking queriesのためのDjangoのドキュメントで開始します。他の人には、他の提案があるかもしれません。

脇に:この場合、レガシーデータベースを使用していない限り、余分なフィールドを定義していないので、結合テーブルEnrollmentを明示的に定義する必要はありません。

+0

ありがとうございました。 enrollmentsテーブルを明示的に定義していない場合、管理エリアを使用してコースに登録することはできませんか? – Deonomo

+0

明示的にenrollmentsテーブルを定義していない場合は、CourseAdminでコースに追加することができます。デフォルトのウィジェットはあまり便利ではないので、['filter_horizo​​ntal'](https://docs.djangoproject.com/ja/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.filter_horizo​​ntal)を設定することができます。または['filter_vertical'](https://docs.djangoproject.com/ja/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