Как фильтровать с помощью 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)