Как получить и отобразить элементы определенной категории с помощью Django и react
Я пытаюсь получить элементы определенной категории, которые затем отображаются через категорию в приложении react. Я создал API с помощью Django restframework, который возвращает элементы такой категории, но используя запрос post. Вот код:
class ProductCategoryView(APIView):
serializer_class = ProductSerializer
permission_classes = (permissions.AllowAny, )
def post(self, request, format=None):
data = self.request.data
category = data['category']
queryset = Product.objects.order_by('-dateCreated').filter(category__iexact=category)
serializer = ProductSerializer(queryset, many=True)
return Response(serializer.data)
Например, допустим, у меня есть 3 категории элементов в базе данных (учебники, журналы и романы). В приложении react frontend я хочу получить только учебники, просмотреть массив учебников и отобразить каждый учебник без отображения элементов из других категорий. Но у меня возникли трудности с реализацией этой задачи, поскольку я использую post request. Передавая конкретную категорию в теле запроса, я получаю в ответ элементы из этой категории. Возможно ли использовать get request и отфильтровать элементы из базы данных таким образом, чтобы я получил только элементы из категории под названием "учебник"?
Да, вы можете использовать get. Для поиска и фильтрации я обычно использую универсальный ListAPIView, который также имеет хорошие функции пагинации.
from rest_framework import generics
class ProductCategoryView(generics.ListAPIView):
serializer_class = ProductSerializer
permission_classes = (permissions.AllowAny, )
queryset = Product.objects.all()
def get_queryset(self):
category = self.request.GET.get('category')
# other_filter = self.request.GET.get('other_filter')
qs = super().get_queryset()
if category:
qs = qs.filter(category__iexact=category)
# if other_filter:
# qs = qs.filter(other_field=other_field)
return qs
и ваш url будет выглядеть следующим образом
/product-list/?category=textbooks
/product-list/?category=textbooks&other_filter=other
>Если вы все еще хотите придерживаться вашего кода выше, вы можете изменить его, чтобы получить следующее
def get(self, request, format=None):
category = request.GET.get('category')
qs = Product.objects.all()
if category:
qs = qs.filter(category__iexact=category)
serializer = self.serializer_class(qs, many=True)
return Response(serializer.data)