2017-12-21 20 views
1

かなり長い結合をしようとしていますが、djangoが最後の層を処理できないようです。私はそれが間違っているか、これを回避する方法はありますか?Djangoと複数の結合

Models.py

class A(models.Model): 
    object_id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=50) 

class B(models.Model): 
    class_A_object = models.ForeignKey(A, on_delete=models.PROTECT) 
    value = models.CharField(max_length=50) 

class C(models.Model): 
    class_B_object = models.ForeignKey(B, on_delete=models.PROTECT) 

class D(models.Model): 
    value= models.IntegerField(primary_key=True) 
    class_C_object = models.ForeignKey(C, on_delete=models.PROTECT) 

私はその後時に関連するクラスのクラスDの値を選択するオブジェクト名= ABCをしようとしています。

D.objects.filter(class_C_object__class_B_object__class_A_object__name='ABC') 

これは失敗します。pycharmが自動完成を拒否し、実行した場合、名前が定義されていないというエラーが表示されます。

ただし、1つのレイヤーをドロップすると機能します。

D.objects.filter(class_C_object__class_B_object__value='ABC') 

私が参加するの最大数を言及するすべての文書を発見していないが、限界がここにありますようにそれは感じています。

誰でも知っていますか?そうであれば、これを回避するにはどうすればよいでしょうか?

データベースは私の外部にあり、変更することはできません。私は現時点で唯一のうまくいくまともな回避策は、カーソルを直接使用して手でSQLを書くことです。しかし、これは多くの理由で理想的ではありません。

ご協力いただければ幸いです。

種類よろしく、 ピーター

+0

正確なエラートレースバックを投稿してください – itzMEonTV

答えて

0

私は多分ないneatestソリューションが、私が望む結果を得るD上__inフィルタのためにそのクエリセットを使用して、一致する名前ABCのクエリセットを取得してことで、これを解決しましたそれはただ1つのクエリを実行しているだけです。

効果的ですが、コードはあまりクリーンではありません。誰かがこれを行うための別の方法の提案を持っているなら、私は聞いて非常にうれしいでしょう。

ありがとう、 Peter