【问题标题】:How to get all children of queryset in django?如何在 django 中获取所有查询集的子项?
【发布时间】:2025-12-08 09:55:02
【问题描述】:

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

对于单只动物,我可以使用animal.categories,这很有效。现在,我想以某种方式做到这一点:

categories = animals.categories

其中动物是查询集。我怎样才能做到这一点?

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    没有办法不遍历查询集,但您可以使用prefetch_related 加快速度:

    all_animals = Animals.objects.prefetch_related('categories')
    categories = [animal.categories.all() for animal in all_animals]
    

    【讨论】:

    • 我后来在代码中使用了values_list,它不适用于categories
    • 我使用了categories.values_list('user_id', flat=True),它返回错误:'list' object has no attribute 'values_list'
    【解决方案2】:

    有两种选择:

    1) 完全按照你的问题,你只能这样做:

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

    2) 但是,我会运行一个具有此类类别的新查询(我不知道您的确切数据模型和措辞,但我想您明白了)

    categories=Category.filter(animals__in=animals).all()
    

    【讨论】:

      【解决方案3】:

      Base:如果animals.categories 给出了一个查询集,这意味着categories 与animal. 具有多对一关系,并且默认名称(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')
      

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

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

      【讨论】: