如何使用Django treebeard获取节点的所有后代?

y3bcpkx1  于 2023-08-08  发布在  Go
关注(0)|答案(3)|浏览(98)

假设我有这些模型:

class Category(MP_Node):
    name = models.CharField(max_length=30)

class Item(models.Model):
    category = models.ForeignKey(Category)

字符串
我想找到所有属于给定Category的任何后代的Item
通常我会写category.item_set,但这只是Item s,属于层次结构的给定级别。
使用treebeard tutorial中的示例树,如果一个项目属于“Laptop Memory”,我如何找到属于后代“Computer Hardware”的所有项目,其中“Laptop Memory”是这些后代之一?

u5rb5r59

u5rb5r591#

我只是遇到了同样的问题,并找到了如何做到这一点(考虑它在ListView的函数get_queryset中):

category = Category.objects.filter(slug=self.kwargs['category']).get()
descendants = list(category.get_descendants().all())
return self.model.objects.select_related('category').filter(category__in=descendants+[category, ])

字符串
我想到的另一个选择是使用带有“OR”的过滤器:

from django.db.models import Q

category = Category.objects.filter(slug=self.kwargs['category']).get()
descendants = list(category.get_descendants().all())
return self.model.objects.select_related('category').filter(Q(category__in=category.get_descendants()) | Q(category=category))

4smxwvx5

4smxwvx52#

我查看了treebeard代码,以了解它如何获取节点的后代。我们可以应用与相关字段查找相同的过滤器。

paramcat = Category.objects.get(id=1) # how you actually get the category will depend on your application
#all items associated with this category OR its descendants:
items = Item.objects.filter(category__tree_id=paramcat.tree_id, category__lft__range=(paramcat.lft,paramcat.rgt-1))

字符串
我认为使用像get_descendants这样的中间调用将导致每个后代一个查询,并将所有后代加载到内存中。它首先挫败了使用treebeard的目的
我有兴趣看到一个自定义查找基于此代码,我不知道如何做到这一点…

8fq7wneg

8fq7wneg3#

例如,您可以在views.py中使用get_descendants()获取某个类别的所有后代,如下所示。* 你可以看到我的答案解释了如何使用get_descendants(include_self=True)获取类别的所有后代,包括模型示例本身:

# "views.py"

from django.http import HttpResponse
from .models import Category, Product

def test(request):
    categories = Category.objects.get(name="Food").get_descendants()
    print(categories) 
    # <TreeQuerySet [<Category: Meat>, <Category: Fish>]>

    products = Product.objects.filter(category__in=categories)
    print(products)
    # <QuerySet [<Product: Beef>, <Product: Pork>, <Product: Salmon>

    return HttpResponse("Test")

字符串

相关问题