2011-12-30 5 views
3

こんにちはStackOverflowの人々、私の現在のプロジェクトでジャンゴ:モデル関数の明確なとSQLクエリ

が、私は以下のモデルの構造を有する:

class Project(models.Model): 
    student_id = models.ForeignKey(User) 
    class_a = models.ForeignKey(ClassA) 
    class_b = models.ForeignKey(ClassB) 
    ... 

class ClassA(models.Model): 
    teacher_name = models.CharField(...) 

class ClassB(models.Model): 
    teacher_name = models.CharField(...) 

がにClassAとClassBのは非常に異なっており、彼らだけが唯一のにはteacher_nameが共通しているので、別のクラスに分けて保存しています。 さらに、各プロジェクトでは、class_a または class_bにのみForeignKeyを含めることができます(2つのクラスに割り当てることはできません)。私はすべてのプロジェクトを表示し、私は先生の名前をリストにしたい場合は

は、それゆえ私は、先生の名前を返す小さなモデル関数を、作成した:

def get_teacher_name(self): 
    if self.class_a: 
     return self.class_a.teacher_name 
    if self.class_b: 
     return self.class_b.teacher_name 

は今、私はクエリを記述したいですSTUDENT_IDのための教師の名前を返し、唯一の教師は一度名前を返し、例えば:学生X プロジェクト教師のための 生物学ミセスX 物理学氏Y ( - >数学Yさんは無視してください)

Djangoクエリをどのように構造化すればよいですか?私はしたいと思います Project.objects.filter(student_id = user.pk).values( 'get_teacher_name')。distinct()、これはできません。それには解決策はありますか?

ありがとうございます。値は、呼び出しのためにあなたのユニークな値を与えるvalueshttps://docs.djangoproject.com/en/dev/topics/db/aggregation/#order-of-annotate-and-values-clauses

annotateを探して

答えて

3

You'er。

import itertools 

class_a_names = user.project_set.values_list('class_a__teacher_name', flat=True).annotate() 
class_b_names = user.project_set.values_list('class_b__teacher_name', flat=True).annotate() 
unique_teachers = set(itertools.chain(class_a_names, class_b_names)) 
+0

ありがとうございました。 project_setがどこから来たのか教えてください。ありがとうございました! – neurix

+0

@neurix - プロジェクトから 'User'に' ForeignKey'がある場合、 'ForeignKey'フィールドに' related_name'引数を指定しない限り、djangoは 'class_set'の形式で逆関連モデルマネージャを追加します。 https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward –

+0

教師のpkをリストに残す方法はありますか?私は( 'class_a_teacher__name'、 'class_a_teacher__pk')を試しましたが、pkが見つかりません。ご協力ありがとうございました! – neurix

関連する問題