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"

Я мог бы использовать ответ Сумитрана, но он был немного сложным, если я хотел бы разрешить несколько полей, потому что для каждого поля я должен был добавить тот же код с некоторыми изменениями, что могло увеличить количество строк кода.

Вернуться на верх