Как отобразить товары из подкатегорий в родительских категориях в Django?

#python #django #django-models #django-views #django-queryset

Вопрос:

models.py

 class Category(models.Model):

    def __str__(self):
        return self.name

    parent = models.ForeignKey('self', related_name='children', on_delete=models.CASCADE, blank=True, null=True)
    name = models.CharField(max_length=60)

class Product(models.Model):
    category = models.ForeignKey(Category, null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=8, decimal_places=2)

    def __str__(self):
    return self.name
 

views.py

 def category(request, id):
    
    category_user = Category.objects.filter(pk=id).prefetch_related(
    'children__product_set',
    ).get()

    products=Product.objects.filter(category__in=category_user.children.all())
    
    context = {'category_user':category_user, 'products': products}

    return render(request, 'store/category.html', context)
 

Теперь товары из разных категорий разделены. Я тоже хочу отобразить товары «для детей» в основной категории, но я не знаю, как это сделать. Пожалуйста, помогите. Заранее благодарю вас.

Комментарии:

1. В вашем шаблоне попробуйте использовать {% for child_category in category_user.children.all %}

2. но я хочу отображать товары, а не категории

Ответ №1:

Вы можете получить доступ к продуктам всех дочерних категорий (ваши «детские» продукты) в своем шаблоне следующим образом:

 {% for child_category in category_user.children.all %}
    {% for child_product in child_category.product_set.all %}
        {{ child_product }}
    {$ endfor}
{% endfor %}
 

Вы также захотите оптимизировать свой запрос для создания продуктов для детей с использованием prefetch_related :

 category_user = Category.objects.filter(pk=id).prefetch_related(
    'children__product_set',
).get()
 

чтобы избежать попадания в базу ДАННЫХ для каждой дочерней категории.

Комментарии:

1. Это работает, но можете ли вы сделать то же самое в views.py? Мне нужно, чтобы все продукты были в одной переменной «продукты», чтобы их разбить на страницы и отсортировать.

2. Для этого вам нужно поделиться своими другими моделями. И если этот ответ вообще помог вам, пожалуйста, подумайте о его принятии

3. В любом случае попробуйте следующее: Product.objects.filter(category__in=category_user.children.all()) . Так как вы не поделились своими моделями, это может не сработать, но вы поняли идею 😉

4. Я только что принял ваш ответ, добавил модель продукта и попробовал ваше решение из последнего комментария, но оно так не работает.

5. Никаких ошибок, та же проблема, что и в начале