Извлечение вложенных дочерних записей в Django Framework - PullRequest
2 голосов
/ 01 ноября 2010

Этот проект разрабатывается на 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.
  • Когда пользователь выбирает категорию футболки, продукт ABC и XYZ должны появляться в наборе результатов.
  • Когда пользователь выбирает категорию MaleTShirts, в наборе результатов должна отображаться только ABC.
  • Когда пользователь выбирает категорию женские футболки, в наборе результатов должна отображаться только XYZ.

Любая идея о том, как должны быть структурированы классы моделей и как мы должны делать запросы, чтобы можно было достичь желаемых результатов.

Любые предложения будут полезны. Было бы хорошо, если бы также был указан код.

Ответы [ 4 ]

1 голос
/ 01 ноября 2010

я думаю, что ваша модель отлично смотрится с полями, которые у вас есть;и для запроса, который вы можете сделать (он не проверен):

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 голос
/ 01 ноября 2010

А как насчет реализации 2-интервальных графов ?

1 голос
/ 01 ноября 2010

Вы можете использовать что-то вроде django-mptt для хранения иерархических данных (вашей модели категорий) в базе данных. Он предоставляет дополнительные методы для извлечения всех потомков определенного элемента. И используя Product.objects.filter(category__in=...) Затем вы можете получить все товары, связанные с потомками выбранной категории.

0 голосов
/ 01 ноября 2010

Для иерархических данных вы, вероятно, захотите начать использовать django-treebeard .

...