Как получить и отобразить элементы определенной категории с помощью 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)
Вернуться на верх