【问题标题】:Django multi level reverse lookupDjango多级反向查找
【发布时间】:2016-08-31 01:42:34
【问题描述】:

我有一个网站,其中的项目按类别和子类别进行分类。我的模型如下所示:

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

我不能按类别按顺序显示所有项目。我需要 for item in category.subcategory_set__item_set.allfor item in category.subcategory_set.all.item_set.all

我知道我可以使用多个查询来完成这项工作(实际上是同时使用两个查询),但我正在尝试使用一个查询来完成这项工作。有可能吗?

【问题讨论】:

    标签: django django-models django-queryset foreign-key-relationship


    【解决方案1】:

    您可以只列出子类别并使用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 %}
    

    你可以用一个查询来完成吗?不是真的,因为您需要一个来迭代所有子类别,然后另一个来让类别生成列表的第一部分

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 1970-01-01
      • 2011-10-01
      • 2014-02-16
      • 1970-01-01
      • 2016-09-15
      • 2013-02-24
      • 2018-10-15
      • 2015-06-04
      相关资源
      最近更新 更多