在Django框架中获取嵌套子记录

2 投票
4 回答
1215 浏览
提问于 2025-04-16 06:23

这个项目是用Python和Django开发的。

根据我的需求,我想从类别中查询所有产品,最多查询到两到三级。

我的实体结构如下。

Category:
- Name
- ParentCategory

Product:
- ID
- Name
- Category

这里是我想要查询的示例记录。

Category:
 - Name: Apparel | Parent:None
 - Name: Shirt | Parent: Apparel
 - Name: TShirts | Parent: Apparel
 - Name: MaleTShirts | Parent:TShirts
 - Name: FemaleTShirts | Parent: TShirts
 - Name:Electornics | Parent:None

Product:
 - ID:1 | Name:ABC | Category:MaleTShirt
 - ID:2 | Name:XYZ | Category:FemaleTShirt
 - ID:3 | Name:JKL | Category:Shirt

问题是,用户应该能够从类别的任何层级访问这些产品。比如,

  • 当用户选择“服装”类别时,产品ABC、XYZ和JKL应该出现在结果中。
  • 当用户选择“T恤”类别时,产品ABC和XYZ应该出现在结果中。
  • 当用户选择“男士T恤”类别时,只有ABC应该出现在结果中。
  • 当用户选择“女士T恤”类别时,只有XYZ应该出现在结果中。

有没有想法关于模型类应该如何结构,以及我们应该如何查询才能得到想要的结果。

任何建议都很有帮助。如果能提供代码示例就更好了。

4 个回答

1

我觉得你的模型看起来挺不错的,字段设置也很好;至于查询,你可以试试下面这个(不过我没有测试过):

list_categories = []

head_category = Category.objects.filter(parent_category=request.GET['category'])

while head_category:
     # Transform the Queryset to a list.
     head_category = [category.category for category in head_category]

     # Put all the new categories in the list
     for category in head_category:
         list_categories.append(category)

     # Get child categories of the current categories.
     child_category = Category.objects.filter(parent_category__in=head_category)
     head_category = child_category

# Get all product from those category list.
Product.objects.filter(category__parent_category__in=list_categories)
1

你有没有想过怎么实现一种叫做2-区间图的东西呢?

1

你可以使用像django-mptt这样的工具来把层级数据(比如你的分类模型)存储在数据库里。这个工具提供了一些额外的方法,可以帮助你获取某个元素的所有子元素。
而且通过使用Product.objects.filter(category__in=...),你就可以找到所有与选定分类的子分类相关的产品。

撰写回答