API-запрос в Django Rest Framework
Я создал API из базы данных, я могу просматривать API, но я не могу сделать запрос, например, через URL: 127.0.0.1:8000/author?author_id=9
, я не уверен, куда добавить код запроса. Я хочу фильтровать по полям. Вот мой models.py
class AuthorAPI(models.Model):
author_id=models.IntegerField()
name=models.TextField()
author_img_url=models.TextField()
title=models.TextField()
first_published_at=models.DateTimeField()
excerpt=models.TextField()
class Meta:
db_table = 'view_author'
serializers.py
from rest_framework import serializers
from .models import SortAPI, AuthorAPI
class AuthorAPISerializer(serializers.ModelSerializer):
class Meta:
model=AuthorAPI
fields='__all__'
views.py
from .serializers import APISerializer,AuthorAPISerializer
from .models import SortAPI, AuthorAPI
from rest_framework.response import Response
from rest_framework.decorators import api_view
@api_view(['GET'])
def getauthor(request):
if request.method == 'GET':
results = AuthorAPI.objects.all()
serialize = AuthorAPISerializer(results, many=True)
return Response(serialize.data)
В своих представлениях используйте ModelViewset
И добавьте атрибут fliter_backend:
filter_backends = [django_filters.rest_framework.DjangoFilterBackend]
Смотрите здесь в документации:
https://www.django-rest-framework.org/api-guide/filtering/#setting-filter-backends
class AuthorViewset(viewsets.ReadOnlyModelViewset):
serializer_class = AuthorAPISerializer
queryset = AuthorAPI.objects.all()
filter_backends = [django_filters.rest_framework.DjangoFilterBackend]
ВАЖНО
Использование django_filter
потребует установки дополнительных требований, но оно того стоит, смотрите шаги по установке django_filter
здесь:
https://django-filter.readthedocs.io/en/stable/guide/install.html
И в вашем urls.py
вам нужно зарегистрировать ваш viewser с SimpleRouter
, как описано в документации здесь:
https://www.django-rest-framework.org/api-guide/viewsets/#example
После завершения, если вы перейдете по адресу /author
, вы увидите некоторые элементы управления фильтрами, и вуаля
Для получения данных из параметров URL можно использовать request.GET.
Попробуйте
@api_view(['GET'])
def getauthor(request):
if request.method == 'GET':
results = AuthorAPI.objects.all()
# get author_id from the url query parameter
author_id = request.GET.get('author_id', None)
#if author_id is present in the url query parameter then filter the resluts queryset based on the author_id
if author_id:
results = results.filter(author_id=author_id)
serialize = AuthorAPISerializer(results, many=True)
return Response(serialize.data)
Спасибо Swift, но были некоторые ошибки, viewsets.ReadOnlyModelViewset
не работал идеально, поэтому я попробовал следующее
views.py
import django_filters.rest_framework
from django.contrib.auth.models import User
from rest_framework import generics,viewsets,filters
from django_filters.rest_framework import DjangoFilterBackend,OrderingFilter
from rest_framework.pagination import PageNumberPagination
from rest_framework.renderers import JSONRenderer
class CustomPagination(PageNumberPagination):
page_size = 50
page_size_query_param = 'page_size'
max_page_size = 1000
class AuthorViewset(generics.ListAPIView):
renderer_classes = [JSONRenderer]
pagination_class = CustomPagination
serializer_class = AuthorAPISerializer
queryset = AuthorAPI.objects.all()
filter_backends = [DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter]
filterset_fields = ['name', 'id','author_id','status','title','first_published_at','story_type']
search_fields=['id','author_id','name','title','first_published_at']
ordering_fields=['id','author_id','name','title','first_published_at']
class Meta:
name="AuthorViewset"
Я мог бы использовать ответ Сумитрана, но он был немного сложным, если я хотел бы разрешить несколько полей, потому что для каждого поля я должен был добавить тот же код с некоторыми изменениями, что могло увеличить количество строк кода.