Django Rest Framework: Вывод товара из категории и подкатегории
Cтолкнулся с проблемой с реализаций вывода товара по категориям и подкатегориям.
У каждого товара (модель Product) есть подкатегория, относящаяся только к одной категории. Нужно сделать так, чтобы при условном нажатии отправлялся GET-запрос, а сервер присылал json с товарами которые относится к подкатегории или к категории в зависимости от того, какой API используем, то есть на frontend условно должно выглядеть так :
- Нажимаем на категорию : Выводится весь список товаров который относится к этой категории и его подкатегории
- Нажимаем на подкатегорию : Выводится список товаром которые относится только к подкатегории
Сейчас структура выглядит так :
Я пробовал отфильтровать через queryset, но я не понимаю как составить API-запрос. Пробовал через django_filtres (фильтрация через URL, по-моему ), но они все мне просто выводили полный список товаров, даже укороченный, без id категории. Вот список, который я получаю по запросу api/vds/product:
models.py
class Product(models.Model):
name = models.CharField(max_length=50, verbose_name='Название')
description = models.CharField(verbose_name='Описание', max_length=1000)
category = models.ForeignKey('Category', on_delete=models.CASCADE, verbose_name='категория')
maker = models.ForeignKey(
'Maker',
on_delete=models.CASCADE,
related_name="products",
blank=True,
null=True,
)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Товар'
verbose_name_plural = 'Товары'
class Category(models.Model):
name = models.CharField(max_length=256)
description = models.TextField()
parent_category = models.ForeignKey(
"self",
blank=True,
null=True,
related_name="children_categories",
on_delete=models.CASCADE,
)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
class Maker(models.Model):
name = models.CharField(max_length=512)
def __str__(self):
return self.name
serializer.py
from rest_framework import serializers
from .models import *
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields ='__all__'
depth = 1
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields ='__all__'
depth = 1
class MakerSerializer(serializers.ModelSerializer):
class Meta:
model = Maker
fields ='__all__'
class SubcategorySerializer(serializers.ModelSerializer):
class Meta:
model =Category
fields ='__all__'
views.py
from .serializer import *
from rest_framework import generics
from .models import *
from django_filters.rest_framework import DjangoFilterBackend
class ProductList(generics.ListCreateAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = [DjangoFilterBackend]
filter_fields = ['category']
class CategoryList(generics.ListCreateAPIView):
queryset = Category.objects.all()
serializer_class = CategorySerializer
class MakerList(generics.ListCreateAPIView):
serializer_class = MakerSerializer
queryset = Maker.objects.all()
class sub_category_list(generics.ListCreateAPIView):
serializer_class = SubcategorySerializer
queryset = Product.objects.all()
filter_backends = [DjangoFilterBackend]
filter_fields = ['category']
urls.py
from django.contrib import admin
from django.urls import path, include, re_path
from main.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('api/vds/product/', ProductList.as_view()),
path('api/vds/category/', CategoryList.as_view()),
path('api/vds/maker', MakerList.as_view()),
# path('api/vds/category/<int:pk>') Здесь я пытался сделать фильтрацию по категории
]

