6

我有一个查询集结果,比如说,动物,它有一个动物列表。有动物的子类别,我想获得所有子类别。IE

对于单个动物,我可以使用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 给出了一个查询集,这意味着类别与动物具有多对一的关系。默认名称(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')

但我建议对类别和动物使用单独的查询(记忆效率更高,但会执行两个查询)。

注意:如果您真的使用一对多,您应该考虑将其更改为多对多。

于 2012-08-27T12:30:37.733 回答