在Django框架中获取嵌套子记录
这个项目是用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=...)
,你就可以找到所有与选定分类的子分类相关的产品。