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循環在我的模板來顯示所有的項目,但我不能按子類別排序。

{% 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 %} 

你可以用一個單一的查詢做呢?不是真的,因爲您需要迭代所有子類別,然後再使用另一個類別來生成列表的第一部分