Как фильтровать с помощью rest api django?

У меня эта модель:

class Item(models.Model):
        
        category = models.CharField(max_length=255)
        subcategory = models.CharField(max_length=255)
        name = models.CharField(max_length=255)
        amount = models.PositiveIntegerField()
  
        def __str__(self) -> str:
            return self.name

serializer:

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('category', 'subcategory', 'name', 'amount')  

views.py:

@api_view(['GET'])
def view_items(request):
    
    queryset = Item.objects.all() 
    serializer = ItemSerializer(queryset, many=True)
    
    # checking for the parameters from the URL
    if request.query_params:
        items = Item.objects.filter(**request.query_params.dict())
    else:
        items = queryset
  
    # if there is something in items else raise error
    if items:
       
        return Response(serializer.data)
    else:
        return Response(status=status.HTTP_404_NOT_FOUND)

 @api_view(['GET'])
    def ApiOverview(request):
        api_urls = {
            'all_items': '/',
            'Search by Category': '/?category=category_name',
            'Search by Subcategory': '/?subcategory=subcategory_name',
            
        }
    
        return Response(api_urls)

urls.py:

urlpatterns = [
    path('', CategoryViewSet.ApiOverview, name='home'),
    path('all/', views.view_items, name='view_items'),
]

Итак, если я пойду на: http://127.0.0.1:8000/djangoadmin/all/

[
    {
        "category": "food",
        "subcategory": "vegetaries",
        "name": "potato",
        "amount": 4
    },
    {
        "category": "food",
        "subcategory": "vegetaries",
        "name": "ananas",
        "amount": 5
    },
    {
        "category": "food",
        "subcategory": "fruit",
        "name": "apple",
        "amount": 3
    }
]

Так что это работает.

Но теперь я хочу вернуть, где подкатегория=овощи.

Поэтому я пытаюсь как: http://127.0.0.1:8000/djangoadmin/all/?subcategory=vegetaries

Но затем он возвращает все элементы:

[
    {
        "category": "food",
        "subcategory": "vegetaries",
        "name": "potato",
        "amount": 4
    },
    {
        "category": "food",
        "subcategory": "vegetaries",
        "name": "ananas",
        "amount": 5
    },
    {
        "category": "food",
        "subcategory": "fruit",
        "name": "apple",
        "amount": 3
    }
]

Вопрос: как фильтровать по подкатегории?

В вашем коде есть одна ошибка, когда вы получаете данные из query_params, то вы не присваиваете их в сериализаторе и возвращаете(serializer.data) в ответ. Вот обновленный код

@api_view(['GET'])
def view_items(request):
    # checking for the parameters from the URL
    if request.query_params:
        items = Item.objects.filter(**request.query_params.dict())
        serializer = ItemSerializer(items , many=True)
    else:
        items= Item.objects.all() 
        serializer = ItemSerializer(items , many=True)
  
    # if there is something in items else raise error
    if items:
        return Response(serializer.data)
    else:
        return Response(status=status.HTTP_404_NOT_FOUND)
Вернуться на верх