В моем проекте я столкнулся с проблемой фильтрация вложенных представлений. У меня имеется модель категории и модель товара, модель в свою очередь связана вторичным ключом с категорией:
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()),
И вот так это соответственно выглядит при вызове представления:
Вот как во вьюхе выглядит представление конкретной категории:
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 параметра:
C query параметром:
Но вот как именно сделать фильтрацию вложенных спискам для категорий не понимаю, заранее спасибо за помощь.