このモデルがあるとします:
class PhotoAlbum(models.Model):
title = models.CharField(max_length=128)
author = models.CharField(max_length=128)
class Photo(models.Model):
album = models.ForeignKey('PhotoAlbum')
「名前が「The」で始まるアルバムを 10 個見つけて、それらのアルバムのすべての写真を教えてください」というクエリを実行します。
SQLでは、次のようにすることができます:
SELECT * FROM
(SELECT * FROM photoalbum WHERE title LIKE 'The%' LIMIT 10) AS selected_albums
LEFT JOIN photo ON photo.album_id = selected_albums.id
私の質問は、Djangoでこれを行うにはどうすればよいですか? (アルバムごとにクエリをトリガーする必要はありません!)これはかなり一般的な要件であると思いますが、それを行う方法がないとは信じられません。
Django-ey の方法がない場合は、「生の SQL を使用して Django でこれを実装するにはどうすればよいですか?」に落ち着きます。
動作しないものを次に示します。
select_related()
; これは前方のForeignKey
関係であり、これは後方の関係です。編集:実際、これはうまくいきます!少なくとも 1 レベルのprefetch_related()
; 前向きな関係にも。ForeignKey
s。PhotoAlbum.photo_set
; これにより、各アルバムのクエリがトリガーされます。私が持っている最も近いものは次のとおりです。
アルバム = PhotoAlbum.objects.all()[:10] 写真 = Photo.objects.filter(album__in=albums)
しかし、悲しいことに、MySQL では動作しません。これが作成する型クエリLEFT JOIN
よりも 'sを使用するほうがよいと言われました。WHERE ... IN (SELECT ...)
編集
この問題に関する 3 年前のメーリング リストの投稿を見つけました。そこに解決策はありません。
彼らはそれを修正しないと言っている6年前のバグレポート。「そういうわけにはいかない」以外の理由はありません。どうやらRoRでも可能です。