@rjunovskii

Фильтрация вложенных представлений в DRF, как реализовать?

В моем проекте я столкнулся с проблемой фильтрация вложенных представлений. У меня имеется модель категории и модель товара, модель в свою очередь связана вторичным ключом с категорией:
spoiler

class Category(models.Model):
    name = models.CharField(max_length=255)
    slug = models.SlugField()
    
    def __str__(self):
        return self.name
    
    def get_absolute_url(self):
        # для доступа к ссылке
        return f'/{self.slug}/'

class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)

    name = models.CharField(max_length=255)
    slug = models.SlugField()       
    subcategory = models.CharField(max_length=255)
    manufacturer = models.CharField(max_length=255, null=True)
    #                               значит что поле необязятельно

    description = models.TextField(blank=True, null=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    image = models.ImageField(upload_to='uploads/', blank=True, null=True)
    thumbnail = models.ImageField(upload_to='uploads/', blank=True, null=True)
    date_added = models.DateField(auto_now_add=True)

    type = models.CharField(max_length=255)
    processor = models.CharField(max_length=255)
    videocart = models.CharField(max_length=255)
    hdd = models.CharField(max_length=255)
    ram = models.CharField(max_length=255)

    class Meta:
        ordering = ('-date_added', )

    def __str__(self):
        return self.name
    
    def get_absolute_url(self):
        return f'/{self.category.slug}/{self.slug}/'



Я реализовал возможность выводить в json все связанные с конкретной категорией товары через сериализаторы:

class CategorySerializer(serializers.ModelSerializer):
    products = ProductSerializer(many=True)

    class Meta:
        model = Category
        fields=(
            'id',
            'name',
            'get_absolute_url',
            'products'
        )


Урлы:
path('products/<category_slug>/', views.CategoryDetail.as_view()),


И вот так это соответственно выглядит при вызове представления:
626fd6efaf62a735689663.png

Вот как во вьюхе выглядит представление конкретной категории:
class CategoryDetail(generics.ListAPIView):
    serializer_class = CategorySerializer
    def get_queryset(self):
        category = self.kwargs['category_slug']
        return Category.objects.filter(slug=category)


Но я хочу сделать фильтрацию по query параметрам вложенного списка товаров, т.е. чтобы я к примеру мог в url задать query параметр и вывести только те товары, у которых subcategory = 'Игровые'. Я смог это реализовать для отдельных представлений товаров, вот так:

Сериализатор:
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 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


Без query параметра:
626fd949747b1813143466.png

C query параметром:
626fd963d2792124830121.png

Но вот как именно сделать фильтрацию вложенных спискам для категорий не понимаю, заранее спасибо за помощь.
  • Вопрос задан
  • 635 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы