0

こんにちは(下手な英語ですみません)!

私がこれを作るとき:

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 django でこのクエリを作成する必要がありますが、可能ですか?

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

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

4

2 に答える 2

1

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

galley_qsビューからテンプレートにプッシュする方法を知っていると思います:

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

あなたのテンプレート/htmlで:

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

    {% endfor %}
{% endfor %}

photosギャラリー モデルの ManyToManyField です。

于 2009-09-03T20:43:03.347 に答える
0

ギャラリーと写真 ID が多対多の関係である場合、photo_id の注釈が付けられた個別のギャラリー レコードを取得しようとするのはなぜですか? 私が知る限り、あなたが実行しているクエリは、ギャラリーごとに 1 つの写真 ID しか取得できません。

上記を本当に行う必要がある場合は、distinct() を使用して個別のギャラリー レコードを取得できると思います (ところで、そこに「all()」は必要ありません)。

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

または、単純に写真 ID に直接アクセスすることもできます。

g = Gallery.objects.annotate(Count('photos'))
# Get the photo
photo = g.photos[0]
于 2009-09-04T00:30:47.250 に答える