Получение всех связанных объектов объектов в наборе запросов
Вчера задал еще один вопрос. К сожалению, ответ не решил проблему, поэтому я решил сузить вопрос и задать его снова.
I have a Category model which is hierarchial(using django-treebeard). When I run example_category.get_descendants()
the result I get is a MP_NodeQuerySet like the following
<MP_NodeQuerySet [<Category: shoes>, <Category: Sneakers>, <Category: laced_sneakers>]>
Из этого набора запросов я хочу получить каждый продукт, относящийся к каждой категории, и отобразить его в представлении (DetailView).
Моя лучшая ставка была
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["products_in_category"] = Category.objects.prefetch_related(
Prefetch("products", queryset=self.object.get_descendants()))
return context
В результате возникает ошибка
"Не удается преобразовать ключевое слово 'category' в поле. Возможные варианты: depth, description, id, numchild, path, products, slug, title"
По какой-то причине я получаю обратно категорию, а не ее продукты, и я не знаю, как решить эту проблему.
Посмотрите старый вопрос для большего контекста или просто спросите!
Даже если бы это сработало, этот запрос вернул бы набор экземпляров Category.
Чтобы получить продукты, которые имеют одну из категорий из get_descendants
, вы можете сделать
from django.db.models import Subquery
categories = example_category.get_descendants()
Product.objects.filter(category__in=Subquery(categories.values("id"))
Использование Subquery
не является обязательным, но это хорошая оптимизация, позволяющая сэкономить на запросе к БД.
Подробнее об этом можно прочитать здесь