2017-10-25 1 views
0

私は3つのテーブルを持って、名前ABC:私は怒鳴るデータを取得したいDjangoでの3レベルクエリの方法は?

class A(models.Model): 
    name = models.CharField(max_length=12) 

class B(models.Model): 
    name = models.CharField(max_length=12) 
    a = models.ForeignKey(to=A) 

class C(models.Model): 
    name = models.CharField(max_length=12) 
    email = models.EmailField() 
    b = models.ForeignKey(to=B) 

:唯一のテーブルがある場合は、参照

[ 
    {"name":"a1", 
    "data":[{ 
     "name":"b1", 
     "data":[ 
      {"name":"c1", 
      "data":{"c1_name":"c1_name", "c1_id":"c1_id"} 
      }, 
      {"name":"c2", 
      "data":{"c2_name":"c2_name", "c2_id":"c2_id"} 
      } 
     ] 
    }, 
    { 
     "name":"b2", 
     "data":[ 
      {"name":"c1", 
      "data":{"c1_name":"c1_name", "c1_id":"c1_id"} 
      }, 
      {"name":"c2", 
      "data":{"c2_name":"c2_name", "c2_id":"c2_id"} 
      } 
      ] 
      } 
     ] 
    } 
] 

は、3レベルのデータがありますAとB、私は複数のテーブルの接続クエリを行うことができます:

B.objects.filter(a='search_id') 

今は3つのテーブルがありますテーブルCのメールにはクエリデータが含まれていません。 私のシナリオでこの要件を実現するには?

+0

[Django - 外部キープロパティのフィルタリング]の複製(https://stackoverflow.com/questions/1981524/django-filtering-on-foreign-key-properties) –

+0

@BrianH。私のシナリオは3レベルの接続です、あなたは2つです。 – aircraft

+1

外部キーをプロパティとして使用し、別の '__'を追加することができます –

答えて

0

@Brian H.がコメントに指摘しているように、__で外部キーをチェーンすることができます。

あなたのケースでは、あなたが

C.objects.filter(b__a='search_id').values('id', 'name', 'b__name', 'b__a__name') 

でデータを得ることができることはでき、そのデータをループして、必要な形式でリストを作成します。

関連する問題