2016-05-19 4 views
1

私は以下の表と関係を持っています。Django ORMを使用してクエリの結果としてクエリセットを取得する方法?

class Customer(models.Model):  
    customer_id = models.BigIntegerField(unique=True, db_index=True)  
    email = models.CharField(max_length=200, blank=True,null=True) 

class B(models.Model): 
    customer_id = models.ForeignKey(Customer, to_field="customer_id", db_column="customer_id") 
    status = models.CharField(max_length=200,blank=False, default="pending") 

class C(models.Model):  
    customer_id = models.ForeignKey(Customer, to_field="customer_id", db_column="customer_id") 
    engagement_rate = models.FloatField(default=0.0) 

は今、私はテーブル お客様からの各行をフェッチするためにページネーションAPIを作成したい、それがテーブルBから関連ディテールだとC.私はこのテーブル間のforiegnキーを設定しています。私はこのblogを読んで結合クエリを行いましたが、私のケースには応募できませんでした。

いずれにしても、私はこのデータをシングルDBコールで取得する方法を提案できます。

+0

をお試しくださいここでの目標は何ですか?私はあなたが見たブログは古いとquerysを操作する他の方法があると思います –

+0

.anotate()を使用してみてください –

答えて

1

1つのクエリですべてのデータをフェッチすることはできません。まあ、サーバーへの単一のクエリです。しかし、それは単一のORMクエリです。

Customer.objects.prefetch_related('c','b').filter(somecondition) 

あなたはそれが1つのSQLクエリになりますが、外部キーの関係が逆に横断しているので、あなたは別のルックアップを行い、prefetch_related

一方、prefetch_related使用する必要がselect_related使用することができた場合それぞれ の関係のために、Pythonで '結合'を行います。これはselect_related

によってサポートされている外部キーと一対一 関係に加えて、それに プリフェッチ多対多および多対一 を行うことができないオブジェクトは、select_related使用することを可能に

これはまだ3つのクエリです。

あなたが本当に本当に1つのSQLクエリでこれをすることに熱心なら。 Customer.objects.raw()はあなたの友人です。

+0

答えをありがとう。この例外が発生しました。 'Customerオブジェクトで' b 'が見つかりません。' b 'はprefetch_related()の無効なパラメータです。 –

+0

実際にモデルを作成してクエリを試しました。私はあなたの本当のモデルが名前BとCではないと確信しています:-) – e4c5

+0

あなたは正しいです、実際のモデルはdiffの名前を持っています。私は実際のモデル名で試しました。動作しません。あなたが私に指示を与えた方法で、私はそれの周りに道を見出そうとします –

0

あなたはそれを1回のコールで行うことはできませんが、確かにそれを2つまたは3つでprefetch_relatedで行うことができます。

A.objects.all().prefetch_related('B', 'C') 
1

正確にどのようなuは参加しようとしている?この

Customer.objects.prefetch_related('b_set', 'c_set').filter(condition) 
+0

ありがとうございます。私はあなたの提案を試みます。 –

関連する問題