Итерировать по всем категориям и всем продуктам каждой категории - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь создать страницу, на которой я oop показываю все мои категории и все товары в каждой категории.

Примерно так:

Category 1:
product1
product2
product3

Category 2:
product1
product2
product3

Category 3:
product1
product2
product3

views.py

def model_categories_view(request):
    context = {
        "categories": ProductCategory.objects.all(),
        "models": ProductModel.objects.filter(???),
    }
    return render(request=request, template_name='main/categories.html', context=context)

категорий. html

{% for category in categories %}

    <h1>{{category.title}}</h1>
    {% for model  in models %}
        {{model.title}}
    {% endfor %}

{% endfor %}

models.py

class ProductModel(models.Model): 
    title = models.CharField(max_length=80)
    category = models.ManyToManyField(ProductCategory)
    model_slug = AutoSlugField(null=True, default=None,
                         unique=True, populate_from='title')

    class Meta:
        verbose_name_plural = "Models"

    def __str__(self):
        return self.title


class ProductCategory(models.Model):
    title = models.CharField(max_length=50)
    category_slug = AutoSlugField(null=True, default=None,
                         unique=True, populate_from='title')

    class Meta:
        verbose_name_plural = "Product Categories"

    def __str__(self):
        return self.title

Как я могу перечислить все модели для текущей категории, итерируемой?

1 Ответ

0 голосов
/ 11 февраля 2020

Вы можете получить набор запросов из связанных продуктов с .productmodel_set. Таким образом, вы можете написать шаблон как:

{% for category in categories %}
    <h1>{{ category.title }}</h1>
    {% for product in category<b>.productmodel_set.all</b> %}
        {{product.title}}
    {% endfor %}
{% endfor %}

Чтобы убедиться, что это сделано эффективно, вы можете использовать .prefetch_related(..) [Django -doc ] для эффективного извлечения всех связанных Product с для заданных ProductCategory с:

def model_categories_view(request):
    context = {
        "categories": ProductCategory.objects<b>.prefetch_related('productmodel')</b>
    }
    return render(
        request=request,
        template_name='main/categories.html',
        context=context
    )

Примечание : обычно модели имеют нет Model суффикс, так что вам лучше переименовать ProductModel в Product.

...