Django中rest_framework的APIView,序列化组件和视图组件

url

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^books/$', views.BookHandle.as_view()),
    url(r'^books/(\d+)', views.GetBookHandle.as_view()),

    url(r'^publishs/$', views.PublishHandel.as_view()),
]

  

views

#####################################################
# request => Request => request.data  (APIView执行流程,且封装了一些组件)
from rest_framework.views import APIView
from rest_framework import serializers     # 序列化组件
from rest_framework.response import Response    # 给前端返回消息
from app01 import models

# get,post,delete方法 用到的序列化组件
class BookSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Book
        fields = '__all__'


# get方法 用到的序列化组件
class BookSerializer_get(serializers.ModelSerializer):

    class Meta:
        model = models.Book
        fields = '__all__'  # 拿到Book表的所有字段['price','title']

        # 除了Book表的price字段(拿到其他所有字段),exclude不能和fields同时用
        # exclude = ('price',)

    #针对多对一字段的序列化,里面有source='',里面写关联的字段名字.被关联表的字段
    publish = serializers.CharField(max_length=32, source='publish.name')

    #针对多对多字段的序列化
    authors = serializers.SerializerMethodField()
    # 多对多字段名前面加get_ 自动执行该方法.传入的参数就是Book表的model对象
    def get_authors(self,obj):
        lis = []
        authors_obj = obj.authors.all()
        for author_obj in authors_obj:
            dic = {}
            dic['name'] = author_obj.name
            lis.append(dic)
        return  lis

# 应用序列化组件
class BookHandle(APIView):

    def get(self,request):
        book_list_obj = models.Book.objects.all()
        # get方法时,自定义序列化参数是查询的到的表的model对象,many

        msg = BookSerializer_get(book_list_obj,many=True)
        return Response(msg.data)

    def post(self,request):
        # post,put方法时,这个自定义序列里面的参数是data=request.data,many
        msg = BookSerializer(data=request.data,many=False)
        if msg.is_valid():
            msg.save()  #create
            return Response(msg.data)
        else:
            return Response(msg.errors)

class GetBookHandle(APIView):

    def put(self,request,id):
        book_obj = models.Book.objects.filter(pk=id).first()
        msg = BookSerializer(data=request.data,many=False,instance=book_obj)
        if msg.is_valid():
            msg.save()
            return Response(msg.data)
        else :
            return Response(msg.errors)

    def delete(self,request,id):
        models.Book.objects.filter(pk=id).delete()
        return Response('')

    def get(self,request,id):
        book_obj = models.Book.objects.filter(pk=id).first()

        msg = BookSerializer_get(book_obj,many=False)
        return Response(msg.data)

#################视图组件##############

class PublishSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Publish
        fields = '__all__'

from rest_framework.mixins import ListModelMixin
from rest_framework import generics

class PublishHandel(ListModelMixin,generics.GenericAPIView):
    queryset = models.Publish.objects.all()
    serializer_class = PublishSerializer

    def get(self,request):
        return self.list(request)

  

猜你喜欢

转载自www.cnblogs.com/gyc-tzx/p/11096260.html
今日推荐