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

本文详细介绍了如何使用 Django 和 REST framework 构建 RESTful API,包括 URL 路由配置、序列化组件的使用、自定义视图类以及处理 GET、POST、PUT 和 DELETE 请求的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

# delete,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)

  

 

转载于:https://www.cnblogs.com/gyc-tzx/p/11096260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值