6

動物のリストを持つクエリセットの結果、たとえば動物があります。動物にはサブカテゴリがあり、すべてのサブカテゴリを取得したいと考えています。すなわち

1匹の動物の場合、どちらが機能するかを使用できますanimal.categories。今、私はどういうわけかこれをしたい:

categories = animals.categories

動物はクエリセットです。どうすればこれを達成できますか?

4

3 に答える 3

9

クエリセットを反復処理せずに実行する方法はありませんが、次のように使用して処理prefetch_relatedを高速化できます。

all_animals = Animals.objects.prefetch_related('categories')
categories = [animal.categories.all() for animal in all_animals]
于 2012-08-27T11:53:44.523 に答える
5

2つのオプションがあります:

1)質問に正確に従うと、次のことしかできません。

categories=[]
for aninmal in animals:
    categories.extend(animal.categories.all())

2)ただし、そのようなカテゴリで新しいクエリを実行します(正確なデータモデルと表現はわかりませんが、アイデアは得られると思います)

categories=Category.filter(animals__in=animals).all()
于 2012-08-27T11:54:12.640 に答える
2

ベース: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 対多を使用している場合は、多対多に変更することを検討してください。

于 2012-08-27T12:30:37.733 に答える