Django:仅当孩子的孩子有数据时才将父数据呈现给模板

时间:2018-06-06 07:33:34

标签: django python-3.x

这是我的models.py

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)

products_h.html (结构简单......)

...
{% for category in categories %}
    {{ category.name }}
    {% for sub_category in category.subcategory_set.all %}
        {{ sub_category.name }}
        {% for list in sub_category.productbasicmodels_set.all %}
            {% if list.whose.id is request.user.id %}
            {{ list.name }}
            {% endif %}
        {% endfor %}
    {% endfor %}
{% endfor %}
....

根据我的代码..显示所有类别和子类别和产品。但我想让它们只展示产品模型中的数据。

像这样......

category1
  subcategory1
    product1
    product2
    product3

category4
  subcategory1
    product4
    product5
  subcategory3
    product6

(category2,3)和(category4的子类别2)未显示,因为他们没有产品..

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

1 个答案:

答案 0 :(得分:0)

利用regroup tag。无需在product_list()方法中获取所有类别。而是获取所有产品(如名称所示)   - 使用prefetch_related到其外键,以优化查询。然后regroup查询集。这就是全部!

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

PS :两个独立的(和类似的)类别&amp;类型的模型子类 多余,您不应该使用它。您可以使用ForeignKey'self'

的单个模型