2009-09-03 10 views
0

こんにちは(私の悪い英語の私を言い訳)!Django:GROUP BYを追加してextra()メソッドを追加しましたか?

私はこの作るとき:

gallery_qs = Gallery.objects.all()\ 
        .annotate(Count('photos'))\ 
        .extra(select={'photo_id': 'photologue_photo.id'}) 

をSQLクエリは次のとおりです。

SELECT (photologue_photo.id) AS `photo`, `photologue_gallery`.* 
FROM `photologue_gallery` 
    LEFT OUTER JOIN `photologue_gallery_photos` 
     ON (`photologue_gallery`.`id` = `photologue_gallery_photos`.`gallery_id`) 
    LEFT OUTER JOIN `photologue_photo` 
     ON (`photologue_gallery_photos`.`photo_id` = `photologue_photo`.`id`) 
GROUP BY `photologue_gallery`.`id`, photologue_photo.id 
ORDER BY `photologue_gallery`.`publication_date` DESC 

問題はextraメソッドが自動的にGROUP BY句でphotologue_photo.idを追加することです。そして、私はそれがギャラリーを複製するため、例えば、それを削除する必要があります。

[<Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>, <Gallery: Lorem ipsum dolor sit amet>] 

私はジャンゴでこのクエリを作成する必要がSiの、それは可能ですか?

SELECT (photologue_photo.id) AS `photo`, `photologue_gallery`.* 
FROM `photologue_gallery` 
    LEFT OUTER JOIN `photologue_gallery_photos` 
     ON (`photologue_gallery`.`id` = `photologue_gallery_photos`.`gallery_id`) 
    LEFT OUTER JOIN `photologue_photo` 
     ON (`photologue_gallery_photos`.`photo_id` = `photologue_photo`.`id`) 
GROUP BY `photologue_gallery` 
ORDER BY `photologue_gallery`.`publication_date` DESC 

ありがとうございます! :)

+0

を写真IDにアクセスすることができ、あなたがGROUP_BYからそれを削除すると、クエリが動作しません。それがSELECTにある場合は、GROUP_BYに存在する必要があります。 – simplyharsh

+0

私は2番目のクエリを使用し、それが動作します。何故なの ? –

答えて

1

私はあなたが本当に余分な必要はないと思う。 Djangoのコンセプトから、Django QuerySetの実行中に特定の列を選択する必要はありません。そのロジックはテンプレート側で行うことができます。

私はあなたのビューからテンプレートにgalley_qsをプッシュする方法を知っていると仮定します。あなたのテンプレート/ HTMLで

# views.py 
gallery_qs = Gallery.objects.all()\ 
       .annotate(Count('photos')) 

{% for gallery in gallery_qs %} 
    {% for photo in gallery.photos %} 

    {% endfor %} 
{% endfor %} 

photosは、あなたのギャラリーのモデルでは、あなたのManyToManyFieldです。

+0

私のテンプレートではなく、私のビューでは、ギャラリーを選択し、*写真をユーザの状態に応じて(たとえば、訪問者のために1つの公開写真でギャラリーを選択する必要があるため) ) –

0

ギャラリーと写真のIDが多対多の関係にあるときに、別のギャラリーのレコードにannotatedというphoto_idを付けるのはなぜですか?私が知ることから、あなたが行っているクエリは各ギャラリーのために1枚の写真IDしか得られません。

あなたが本当に上記を行う必要があるなら、私はdistinct()を使って別個のギャラリーレコードを取得することができます(btw、そこに「all()」は必要ありません)。

Gallery.objects.distinct()\ 
       .annotate(Count('photos'))\ 
       .extra(select={'photo_id': 'photologue_photo.id'}) 

それとも、ただ単に私の知る限り見るように、直接

g = Gallery.objects.annotate(Count('photos')) 
# Get the photo 
photo = g.photos[0] 
+0

こんにちは、私はdistinct()を使ってみましたが、私はいつも次のようなギャラリーを複製しました: '' [] '' –

関連する問題