動物のリストを持つクエリセットの結果、たとえば動物があります。動物にはサブカテゴリがあり、すべてのサブカテゴリを取得したいと考えています。すなわち
1匹の動物の場合、どちらが機能するかを使用できますanimal.categories
。今、私はどういうわけかこれをしたい:
categories = animals.categories
動物はクエリセットです。どうすればこれを達成できますか?
動物のリストを持つクエリセットの結果、たとえば動物があります。動物にはサブカテゴリがあり、すべてのサブカテゴリを取得したいと考えています。すなわち
1匹の動物の場合、どちらが機能するかを使用できますanimal.categories
。今、私はどういうわけかこれをしたい:
categories = animals.categories
動物はクエリセットです。どうすればこれを達成できますか?
クエリセットを反復処理せずに実行する方法はありませんが、次のように使用して処理prefetch_related
を高速化できます。
all_animals = Animals.objects.prefetch_related('categories')
categories = [animal.categories.all() for animal in all_animals]
2つのオプションがあります:
1)質問に正確に従うと、次のことしかできません。
categories=[]
for aninmal in animals:
categories.extend(animal.categories.all())
2)ただし、そのようなカテゴリで新しいクエリを実行します(正確なデータモデルと表現はわかりませんが、アイデアは得られると思います)
categories=Category.filter(animals__in=animals).all()
(ベース:animals.categoriesがquerysetを与えている場合、これはカテゴリがアニマルと多対1であることを意味し、デフォルト名(category_set)がカテゴリで変更されます)
メインクエリは、動物ではなくカテゴリクエリにする必要があるようです。次のような動物を取得するとしましょう。
Animals.objects.filter(name__startswith='A')
次のクエリでこの動物のカテゴリを取得できます
Category.objects.filter(animal__name__startswith='A')
このクエリで動物を取得することもできます
Category.objects.filter(animal__name__startswith='A').select_related('category')
ただし、カテゴリと動物には別々のクエリを使用することをお勧めします (メモリ効率は向上しますが、2 つのクエリを実行します)。
注: 本当に 1 対多を使用している場合は、多対多に変更することを検討してください。