私がこのモデルを持っているとしましょう:
class PhotoAlbum(models.Model):
title = models.CharField(max_length=128)
author = models.CharField(max_length=128)
class Photo(models.Model):
album = models.ForeignKey('PhotoAlbum')
format = models.IntegerField()
ここで、アルバムのサブセット内の写真のサブセットを効率的に見たい場合。私はそれを次のようにします:
someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
somePhotos = a.photo_set.all()
これは2つのクエリのみを実行します。これは私が期待するものです(1つはアルバムを取得し、もう1つは `SELECT * IN photos WHERE photoalbum_id IN()のようなものです。
すべてが素晴らしいです。
しかし、私がこれを行う場合:
someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
somePhotos = a.photo_set.filter(format=1)
次に、WHERE format = 1
!を使用して大量のクエリを実行します。私は何か間違ったことをしていますか、それともdjangoはすでにすべての写真をフェッチしていて、Pythonでそれらをフィルタリングできることに気付くほど賢くありませんか?ドキュメントのどこかでそれを行うことになっていることを読んだことを誓います...