Django:呈现父对象';仅当子项的子项具有数据时,才会将数据添加到模板

Django:呈现父对象';仅当子项的子项具有数据时,才会将数据添加到模板,django,python-3.x,Django,Python 3.x,这是我的模特 class Category(models.Model): name = models.CharField(max_length=50) ordering_num = models.IntegerField(default=0) class Meta: ordering = ['ordering_num'] def __str__(self): return self.name class SubCategory

这是我的模特

class Category(models.Model):
    name = models.CharField(max_length=50)
    ordering_num = models.IntegerField(default=0)

    class Meta:
        ordering = ['ordering_num']

    def __str__(self):
        return self.name

class SubCategory(models.Model):
    category = models.ForeignKey('Category', on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    ordering_num = models.IntegerField(default=0)

    class Meta:
        ordering = ['ordering_num']

    def __str__(self):
        return self.name

class ProductBasicModels(models.Model):
    whose = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    category = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    standard = models.CharField(max_length=50)
    maker = models.CharField(max_length=50, blank=True)
    outbox = models.CharField(max_length=50, blank=True)
    extra = models.CharField(max_length=100, blank=True)
    orderto = models.ForeignKey(OrderCompany, null=True, blank=True, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name
views.py

@ login_required
def product_list(request):
    categories = Category.objects.all()
    context = {'categories': categories}
    return render(request, 'medicalapp_1/products_h.html', context)
产品_h.html (结构简单…)

根据我的密码。。显示的所有类别、子类别和产品。但我想让他们只显示产品模型有数据

像这样

category1
  subcategory1
    product1
    product2
    product3

category4
  subcategory1
    product4
    product5
  subcategory3
    product6
(类别2,3)和(类别4的子类别2)不显示,因为它们没有产品

如何使视图中的过滤器像它一样工作?

利用。无需在
product\u list()
方法中获取所有类别。取而代之的是获取所有产品(顾名思义) -使用与其外键相关的
预取
,以优化查询。然后重新组合查询集。就这些

def product_list(request):
    products = ProductBasicModels.objects.all().prefetch_related('category','category__category')
    context = {'products': products}
    return render(request, 'medicalapp_1/products_h.html', context)
然后,在模板中

{% regroup products by category.category as cats %}
{% for cat in cats %}
    <br>{{cat.grouper}}
    {% regroup cat.list by category as subcats %}
    {% for subcat in subcats %}
        <br>{{subcat.grouper}}
        {% for product in subcat.list %}
            <br>{{product}}
        {% endfor %}
    {% endfor %}
{% endfor %}
{%按类别重新组合产品。类别为cats%}
{猫中猫的百分比%}

{{cat.gropper}} {%按类别将类别列表重新组合为子类别%} {子类别%中的子类别为%1}
{{subcat.grouper}} {subcat.list%中产品的%s}
{{product}} {%endfor%} {%endfor%} {%endfor%}

PS:类别和子类别的两个独立(&类似)模型是冗余的,您不应该使用它。您可以只使用带有
ForeignKey
的单一型号来
'self'

太好了!它很漂亮,很干净。我会根据你的建议更换型号。非常感谢你!还有一个问题。。如果我需要按子类别对显示数据进行排序,该怎么办?在那个视图中我该怎么办?我刚刚找到了过滤解决方案并应用了它。订购人(“类别订购数量”)谢谢!!
{% regroup products by category.category as cats %}
{% for cat in cats %}
    <br>{{cat.grouper}}
    {% regroup cat.list by category as subcats %}
    {% for subcat in subcats %}
        <br>{{subcat.grouper}}
        {% for product in subcat.list %}
            <br>{{product}}
        {% endfor %}
    {% endfor %}
{% endfor %}