Фильтрация вложенных представлений в DRF, как реализовать?
Имеются сериализатор товара:
class ProductSerializer(serializers.ModelSerializer):
category = serializers.SlugRelatedField(slug_field="name", read_only=True)
class Meta:
model = Product
fields=(
'id',
'name',
'category',
'subcategory',
'manufacturer',
'get_absolute_url',
'description',
'price',
'get_image',
'get_thumbnail'
)
А также сериализатор категории, который формирует вложенное представление товаров, связанных с этой категорией:
class CategorySerializer(serializers.ModelSerializer):
products = ProductSerializer(many=True)
class Meta:
model = Category
fields=(
'id',
'name',
'get_absolute_url',
'products'
)
Выглядит это следующим образом:
{
"id": 4,
"name": "Ноутбуки",
"get_absolute_url": "/notebooks/",
"products": [
{
"id": 3,
"name": "HP for work",
"category": "Ноутбуки",
"subcategory": "Рабочие",
"manufacturer": "HP",
"get_absolute_url": "/notebooks/hp_2000/",
"description": "desc",
"price": "25000.00",
"get_image": "http://127.0.0.1:8000/media/uploads/slidebar-image1.jpg",
"get_thumbnail": "http://127.0.0.1:8000/media/uploads/uploads/slidebar-image1.jpg"
},
{
"id": 1,
"name": "Топовый Acer for GAME",
"category": "Ноутбуки",
"subcategory": "Игровые",
"manufacturer": "Acer",
"get_absolute_url": "/notebooks/acer_for_game/",
"description": "Описание",
"price": "50000.00",
"get_image": "http://127.0.0.1:8000/media/uploads/AcerAspire_6m9A45R.jpg",
"get_thumbnail": "http://127.0.0.1:8000/media/uploads/uploads/AcerAspire_6m9A45R.jpg"
}
]
}
Также могу с помощью query параметров в url вывести отфильтрованные товары например по subcategory: url = http://127.0.0.1:8000/api/products/query-product/?sub=Игровые
[
{
"id": 1,
"name": "Топовый Acer for GAME",
"category": "Ноутбуки",
"subcategory": "Игровые",
"manufacturer": "Acer",
"get_absolute_url": "/notebooks/acer_for_game/",
"description": "Описание",
"price": "50000.00",
"get_image": "http://127.0.0.1:8000/media/uploads/AcerAspire_6m9A45R.jpg",
"get_thumbnail": "http://127.0.0.1:8000/media/uploads/uploads/AcerAspire_6m9A45R.jpg"
}
]
Вот тут происходит фильтрация:
class ProductQueryList(generics.ListAPIView):
serializer_class = ProductSerializer
def get_queryset(self):
queryset = Product.objects.all()
subcategory_name = self.request.query_params.get('sub')
if subcategory_name is not None:
queryset = queryset.filter(subcategory = subcategory_name)
return queryset
Застрял на моменте фильтрации для категорий, тут я либо передаю queryset содержащий конкретную категорию, либо передаю отфильтрованные товары, связанные с этой категорией в тот же queryset:
class CategoryDetail(generics.ListAPIView):
serializer_class = CategorySerializer
def get_queryset(self):
category = self.kwargs['category_slug']
# queryset = Category.objects.get(slug=category)
# subcategory_name = self.request.query_params.get('sub')
# # if subcategory_name is not None:
# queryset = queryset.products.filter(subcategory = subcategory_name)
return Category.objects.filter(slug=category)
Можно ли как-то передать что-то вроде "queryset.products" для вложенного списка products? Т.е. как-то передать в queryset и категорию, и переопределить вложенные в нее products