0

У меня есть сайт, где элементы разделены по категориям и подкатегориям. Мои модели выглядят следующим образом:Django многоуровневый обратный поиск

from django.db import models 

class Category(models.Model): 
    name = models.CharField(max_lenght=100) 

class Subcategory(models.Model): 
    name = models.CharField(max_lenght=100) 
    category = models.ForeignKey('Category') 

class Item(models.Model): 
    name = models.CharField(max_lenght=100) 
    subcategory = models.ForeignKey('Subcategory') 

Мне нужно, чтобы отобразить все элементы одной категории и все подкатегории с элементами в одной и той же странице (это необходимая часть проекта) и списки должны быть в порядке, как это:

Категория:

  • Пункт 1
  • Пункт 2
  • Пункт 3
  • Пункт 4
  • Пункт 5
  • Пункт 6

Подкатегория 1

  • Пункт 1
  • Пункт 3
  • Пункт 4

Подкатегория 2

  • Пункт 2
  • Пункт 5
  • Пункт 6

До сих пор у меня есть два запроса, но Возможное я не могу это сделать.

items = Item.objects.prefetch_related('subcategory', 'subcategory__category').filter(subcategory__category__slug=categorySlug) 

Этот запрос дает мне QuerySet и я могу сделать цикл в шаблоне, чтобы показать все элементы, но я не могу заказать их по подкатегориям.

{% for item in items %} 

Что мне нужно что-то вроде для подкатегории в items.subcategory.

Следующий запрос является обратным:

category = Category.objects.prefetch_related('subcategoria_set', 'subcategoria_set__item_set').get(slug=categorySlug) 

С помощью этого запроса я могу сделать цикл, чтобы показать детали подкатегории

{% for subcategory in category.subcategory_set.all %} 
    {% for item in subcategory.item_set.all %} 

То, что я не могу сделать, это показать все товары по категориям. Мне нужно что-то вроде для пункта в category.subcategory_set__item_set.all или для пункта в category.subcategory_set.all.item_set.all

Я знаю, что я могу сделать это с помощью нескольких querys (на самом деле, используя два запросов в то же время), но я пытаюсь использовать один запрос для выполнения этой задачи. Это возможно?

ответ

0

Вы можете просто взять список подкатегорий и использовать regroup

{% regroup subcategories by category as subcat_list %} 

<ul> 
{% for sub_cat in subcat_list %} 
    <li>{{ sub_cat.grouper }} 
    <ul> 
     {% for item in sub_cat.list %} 
      <li>{{ item.name }}</li> 
     {% endfor %} 
    </ul> 
    </li> 
{% endfor %} 

Вы можете сделать это с помощью одного запроса? Не так, так как вам нужно, чтобы он перебирал все подкатегории, а затем другой для категорий, чтобы создать первую часть вашего списка.

Смежные вопросы