• restframwork之序列化


    一 restframwork为我们提供了一个快速实例,方便我们快速理解restframwork的序列化的原理。

    快速实例化

    Django REST framework API 指南

     二 restframwork序列化

         开发我们的Web API(应用程序接口)的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式。我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现。

     1 首先创建一个序列化类 

      1 models部分:

    from django.db import models
    
    # Create your models here.
    
    
    class Book(models.Model):
        title=models.CharField(max_length=32)
        price=models.IntegerField()
        pub_date=models.DateField()
        publish=models.ForeignKey("Publish")
        authors=models.ManyToManyField("Author")
        def __str__(self):
            return self.title
    
    class Publish(models.Model):
        name=models.CharField(max_length=32)
        email=models.EmailField()
        def __str__(self):
            return self.name
    
    class Author(models.Model):
        name=models.CharField(max_length=32)
        age=models.IntegerField()
        def __str__(self):
            return self.name

    2 view部分:

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from .models import *
    from django.shortcuts import HttpResponse
    from django.core import serializers
    
    
    from rest_framework import serializers
    
    class BookSerializers(serializers.Serializer):
        title=serializers.CharField(max_length=32)
        price=serializers.IntegerField()
        pub_date=serializers.DateField()    
       ## 对于多对一的字段我们需要添加source=“publish.name” 从而取到我们对应模型类中的字段,而不是显示关联的id。 publish
    =serializers.CharField(source="publish.name") #authors=serializers.CharField(source="authors.all")

    ### 那么对于多对多的字段我们需要自定义一个方法,来拿到对应模型类model中的所有字段,显示出来。 authors=serializers.SerializerMethodField() def get_authors(self,obj): # 其中obj为当前模型类Book的对象。 temp=[] for author in obj.authors.all(): temp.append(author.name) # 将author的名字添加到一个列表中。 return temp class BookViewSet(APIView): def get(self,request,*args,**kwargs): book_list=Book.objects.all()
    # 序列化方式1:使用django进行序列化操作。 # from django.forms.models import model_to_dict # import json # data=[] # for obj in book_list: # data.append(model_to_dict(obj)) # print(data) # return HttpResponse("ok") # 序列化方式2: 继承serializers.Serialize进行自定制的序列化。
         # data=serializers.serialize("json",book_list) 
         # return HttpResponse(data)
        
    #
    序列化方式3: ModelSerializer序列化组件
    # bs=BookSerializers(book_list,many=True) return Response(bs.data)
    以上三种序列化的方式:
    第一种使用的还是django的序列化方式。
    第二,三种则是使用restframwork的方式,分别继承:serializers.Serializer和serializers.ModelSerializer

    3 ModelSerializer:

    class BookSerializers(serializers.ModelSerializer):
          class Meta:
              model=Book
              fields="__all__"
          exclude=(‘nid’,)
    depth=1

    4 提交post的请求:

    def post(self,request,*args,**kwargs):
           
            bs=BookSerializers(data=request.data,many=False)
            if bs.is_valid():
                # print(bs.validated_data)
                bs.save()
                return Response(bs.data)
            else:
                return HttpResponse(bs.errors)

     5 那么对于不同的请求条件不同,我们更新PUT的请求肯定与GET的请求是不用的url:

    url:

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
        url(r'^login/$', views.LoginView.as_view()),
        url(r'^courses/$', views.CourseView.as_view()),
        url(r'^publishes/$', views.PublishView.as_view()),
        url(r'^books/$', views.BookView.as_view()),
        url(r'^books/(?P<pk>d+)/$', views.BookDetailView.as_view()),
    
        url(r'^authors/$', views.AuthorView.as_view()),
        url(r'^authors/(?P<pk>d+)/$', views.AuthorDetailView.as_view()),
    ]

    view.py

    class AuthorView(APIView):
        def get(self, request):
            author_list = Author.objects.all()
    
            # 方式1: Django的序列化组件
            # ret=serialize("json",publish_list)
            # 方式2:rest的序列化
            As = AuthorSerializers(author_list, many=True)
            # 序列化数据
    
            return Response(As.data)
    
        def post(self, request):
    
            # 添加一条数据
            print(request.data)
    
            As = AuthorSerializers(data=request.data)
            if As.is_valid():
                As.save()  # 生成记录
                return Response(As.data)
            else:
    
                return Response(As.errors)
    
    
    class AuthorDetailView(APIView):
        def get(self, request, pk):
            author_obj = Author.objects.filter(pk=pk).first()
            As = AuthorSerializers(author_obj, many=False)
    
            return Response(As.data)
    
        def put(self, request, pk):
            author_obj = Author.objects.filter(pk=pk).first()
    
            As = AuthorSerializers(data=request.data, instance=author_obj)
            if As.is_valid():
                As.save()  # update
                return Response(As.data)
            else:
                return Response(As.errors)
    
        def delete(self, request, pk):
            Author.objects.filter(pk=pk).delete()
    
            return Response("")
    View Code

  • 相关阅读:
    依赖倒置原则
    接口声明
    java泛型
    RandomAccessFile
    InputStreamReader/OutputStreamWriter乱码问题解决
    InputStreamReader和OutputStreamWriter
    Android开发UI之Notification
    Android开发UI之Toast的使用
    Android开发之PagerAdapter
    Android开发UI之ViewPager及PagerAdapter
  • 原文地址:https://www.cnblogs.com/zhangsanfeng/p/9401243.html
Copyright © 2020-2023  润新知