#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. Никаких ошибок, та же проблема, что и в начале