Фильтрация вложенных представлений в 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


Ответы (0 шт):