在django框架中获取嵌套的子记录

时间:2010-11-01 15:04:38

标签: python django django-models

这个项目是用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应出现在结果集中。
  • 当用户选择类别TShirts时,产品ABC和XYZ应出现在结果集中。
  • 当用户选择类别MaleTShirts时,结果集中只应显示ABC。
  • 当用户选择类别FemaleTShirts时,结果集中只应出现XYZ。

任何想法应该如何构建模型类,以及我们应该如何查询以便实现所需的结果。

任何建议都会有所帮助。如果还提供代码将会很好。

4 个答案:

答案 0 :(得分:1)

如何考虑实施2-interval graphs

答案 1 :(得分:1)

您可以使用django-mptt之类的东西将分层数据(您的Categories模型)存储在数据库中。它提供additional methods来检索某些元素的所有后代。 并使用 Product.objects.filter(category__in=...) 然后,您可以检索与所选类别的后代相关的所有产品。

答案 2 :(得分: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)

答案 3 :(得分:0)

对于分层数据,您可能希望开始使用django-treebeard