2009-06-24 21 views
1

のクエリでは、私は2つのモデルが 私がコメント欄にアバターを表示するには、このモデルを使用しています。DjangoのORM:二つのモデル

django_comments:

user_id 
comment 
..... 

myapp_profile

user_id 
image_path 
...... 

実は、このデータを取得するために、)(cursor.executeで生のクエリを実行する - 私

------- ---------- ------- 
'user_id' 'image_path' 'comment' 
------- ---------- ------- 
    3  name.jpg  test 

しかし、私はしたい「ジャンゴORM方法」

どれ溶液中ですか?

ありがとうございました

答えて

5

これについて考えてみましょう:戻ってきますか?それはどちらのモデルのインスタンスでもないでしょうか?

しかし、(新しい注釈付き)とF()の機能、あなたが何かやってのけることができるかもしれない:もちろん

Comment.objects.all().annotate(image_path=F('user__profile__image_path')) 

を、あなたは可能性が常にちょうど:

Comment.objects.all().select_related() 

x.user.get_profile()からimage_pathを取得します。image_path

+0

Comment.objects.all()注釈(IMAGE_PATH = F( 'user__profile__image_path')) 私は良い解決策ようだが、problemaがあります私は、Djangoの1.0 使用しています - 。Comment.objects.allを()select_related() 唯一の問題は、私は唯一のクエリを実行したいということです。お時間 –

+0

@gerため おかげで、だからあなたの選択肢は明確である:ORMはあなたが必要とする機能のために、Djangoのトランクにアップグレードする複数のクエリを受け入れるか、またはあなたが今しているとして、生のSQLを使用しています。 –

+1

これも必要です(select2relany(1行に適切にフィルタリングされた)多数の関係であるため、select_related()は機能しません)。上記は機能しません: 'F'オブジェクトには属性 'lookup'がありません。 – miracle2k

1

チケット#14030で提案されている機能をお探しの場合、次の作業を行います:

Comment.objects.all().annotate(image_path=F('user__profile__image_path')) 

私が現在使用していますどのような:。

Comment.objects.all().extra(select={'image_path': 'profiletable.image_path'})