我有一个查询集结果,比如动物,它有一个动物列表。有动物的子类别,我想得到所有的子类别。即。
对于单一动物,我可以使用animal.categories
。现在,我想以某种方式这样做:
categories = animals.categories
动物是查询集。我怎样才能做到这一点?
答案 0 :(得分:5)
有两个选项:
1)完全按照你的问题,你只能这样做:
categories=[]
for aninmal in animals:
categories.extend(animal.categories.all())
2)但是,我会运行一个类似类别的新查询(我不知道你的确切数据模型和措辞,但我认为你明白了)
categories=Category.filter(animals__in=animals).all()
答案 1 :(得分:4)
没有迭代查询集是没有办法的,但你可以使用prefetch_related
来加快速度:
all_animals = Animals.objects.prefetch_related('categories')
categories = [animal.categories.all() for animal in all_animals]
答案 2 :(得分: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')
但是我建议对类别和动物使用单独的查询(会更有效,但会进行两次查询)。
注意:如果您真的使用一对多您应该考虑将其更改为多对多。