• 三 .Django---framework框架 序列化视图三部曲


    一  视图三部曲(序列化)

    https://www.cnblogs.com/pythonywy/p/11491625.html     drf框架中所有视图及用法

    https://www.cnblogs.com/liwenzhou/p/9403382.html     视图和路由

    https://www.cnblogs.com/pythonywy/p/11491625.html     drf框架中所有视图及用法

    https://www.cnblogs.com/pythonywy/p/11497730.html     django-drf框架自带的路由以及最简化的视图

    1. 使用混合(mixins)方式一

    # Create your models here.
    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(auto_now=True)
        publish=models.ForeignKey("Publish",on_delete=models.CASCADE)      # ForeignKey一对多
        authors=models.ManyToManyField("Author")        # ManyToManyField  多对多
        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
    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
    import  json
    
    from rest_framework import serializers
    
    
    class BookSerializers(serializers.ModelSerializer):
          class Meta:
              model=Book
              fields="__all__"
              #depth=1
    
    
    class PublshSerializers(serializers.ModelSerializer):
          class Meta:
              model=Publish
              fields="__all__"
              depth=1
    
    
    class BookViewSet(APIView):
        def get(self,request,*args,**kwargs):
            book_list=Book.objects.all()
            bs=BookSerializers(book_list,many=True,context={'request': request})
            return Response(bs.data)
    
    
        def post(self,request,*args,**kwargs):
            print(request.data)
            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)
    
    
    class BookDetailViewSet(APIView):
        def get(self,request,pk):
            book_obj=Book.objects.filter(pk=pk).first()
            bs=BookSerializers(book_obj,context={'request': request})
            return Response(bs.data)
    
        def put(self,request,pk):
            book_obj=Book.objects.filter(pk=pk).first()
            bs=BookSerializers(book_obj,data=request.data,context={'request': request})
            if bs.is_valid():
                bs.save()
                return Response(bs.data)
            else:
                return HttpResponse(bs.errors)
    
    
    class PublishViewSet(APIView):
        def get(self,request,*args,**kwargs):
            publish_list=Publish.objects.all()
            bs=PublshSerializers(publish_list,many=True,context={'request': request})
            return Response(bs.data)
    
        def post(self,request,*args,**kwargs):
    
            bs=PublshSerializers(data=request.data,many=False)
            if bs.is_valid():
                # print(bs.validated_data)
                bs.save()
                return Response(bs.data)
            else:
                return HttpResponse(bs.errors)
    
    
    
    class PublishDetailViewSet(APIView):
        def get(self,request,pk):
            publish_obj=Publish.objects.filter(pk=pk).first()
            bs=PublshSerializers(publish_obj,context={'request': request})
            return Response(bs.data)
    
        def put(self,request,pk):
            publish_obj=Publish.objects.filter(pk=pk).first()
            bs=PublshSerializers(publish_obj,data=request.data,context={'request': request})
            if bs.is_valid():
                bs.save()
                return Response(bs.data)
            else:
                return HttpResponse(bs.errors)
        url(r'^books/$', views.BookViewSet.as_view(), name="book_list"),
        url(r'^books/(?P<pk>d+)$', views.BookDetailViewSet.as_view(), name="book_detail"),
        url(r'^publishers/$', views.PublishViewSet.as_view(), name="publish_list"),
        url(r'^publishers/(?P<pk>d+)$', views.PublishDetailViewSet.as_view(), name="publish_detail"),

    2. mixin类编写视图(方式二)

    model类  一样
    from rest_framework import mixins
    from rest_framework import generics
    from .models import *
    
    
    
    from rest_framework import serializers
    
    from django.core import serializers
    import  json
    
    
    class BookSerializers(serializers.Serializer):
        title = serializers.CharField(max_length=32)
        price = serializers.IntegerField()
    
        publish=serializers.CharField(source="publish.name")   # ForeignKey一对多  序列化
        #authors=serializers.CharField(source="authors.all")
        authors = serializers.SerializerMethodField()               # ManyToManyField  多对多   序列化
        def get_authors(self,obj):
            temp=[]
            for obj in obj.authors.all():
                temp.append(obj.name)
            return temp
    
    
    class BookViewSet(mixins.ListModelMixin,
                      mixins.CreateModelMixin,
                      generics.GenericAPIView):
    
        queryset = Book.objects.all()
        serializer_class = BookSerializers
    
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    
    
        def post(self, request, *args, **kwargs):
            return self.create(request, *args, **kwargs)
    
    
    
    class BookDetailViewSet(mixins.RetrieveModelMixin,
                        mixins.UpdateModelMixin,
                        mixins.DestroyModelMixin,
                        generics.GenericAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializers
    
        def get(self, request, *args, **kwargs):
            return self.retrieve(request, *args, **kwargs)
    
        def put(self, request, *args, **kwargs):
            return self.update(request, *args, **kwargs)
    
        def delete(self, request, *args, **kwargs):
            return self.destroy(request, *args, **kwargs)
    url类路径一样

     3. 使用通用的基于类的视图 (方式三)

    通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的views.py
    model类  url路径  一样
    from rest_framework import mixins
    from rest_framework import generics
    
    class BookViewSet(generics.ListCreateAPIView):
    
        queryset = Book.objects.all()
        serializer_class = BookSerializers
    
    class BookDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
        queryset = Book.objects.all()
        serializer_class = BookSerializers
    
    class PublishViewSet(generics.ListCreateAPIView):
    
        queryset = Publish.objects.all()
        serializer_class = PublshSerializers
    
    class PublishDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
        queryset = Publish.objects.all()
        serializer_class = PublshSerializers
    from rest_framework import serializers
    
    from app01.models import *
    # 为queryset,model对象做序列化
    class PublishSerializers(serializers.Serializer):
        name = serializers.CharField()
        email = serializers.CharField()
    
    
    class PublishModelSerializers(serializers.ModelSerializer):
        class Meta:
            model=Publish
            fields="__all__"
    
    
    
    
    # class BookSerializers(serializers.Serializer):
    #     title = serializers.CharField(max_length=32)
    #     price = serializers.IntegerField()
    #     pub_date = serializers.DateField()
    #     publish=serializers.CharField(source="publish.name")
    #     #authors=serializers.CharField(source="authors.all")
    #     authors = serializers.SerializerMethodField()
    #     def get_authors(self,obj):
    #         temp=[]
    #         for obj in obj.authors.all():
    #             temp.append(obj.name)
    #         return temp
    
    '''
    序列化BookSerializers(book_list,many=True)过程:
         temp=[]
         for obj in book_list:
             temp.append({
                "title":obj.title,
                "price":obj.price,
                "pub_date":obj.pub_date,
                "publish":str(obj.publish), # obj.publish.name
                #"authors":obj.authors.all,
                "authors": get_authors(obj)
             })
    
    '''
    
     BookSerializers
    class BookModelSerializers(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = "__all__"
    
        #publish=serializers.CharField(source="publish.pk")
        publish=serializers.HyperlinkedIdentityField(
                view_name="detailpublish",
                lookup_field="publish_id",
                lookup_url_kwarg="pk",
    
        )
    
    
        # authors=serializers.CharField(source="authors.all")
        # authors = serializers.SerializerMethodField()
        # def get_authors(self,obj):
        #     temp=[]
        #     for obj in obj.authors.all():
        #         temp.append(obj.name)
        #     return temp
    
        def create(self, validated_data):
            print("validated_data",validated_data)
            book=Book.objects.create(title=validated_data["title"],price=validated_data["price"],pub_date=validated_data["pub_date"],
    publish_id=validated_data["publish"]["pk"]) book.authors.add(*validated_data["authors"]) return book class AuthorModelSerializers(serializers.ModelSerializer): class Meta: model = Author fields = "__all__"

    5. viewsets.ModelViewSet(方式四)

    url(r'^books/$', views.BookViewSet.as_view({"get":"list","post":"create"}),name="book_list"),
        url(r'^books/(?P<pk>d+)$', views.BookViewSet.as_view({
                    'get': 'retrieve',
                    'put': 'update',
                    'patch': 'partial_update',
                    'delete': 'destroy'
                }),name="book_detail"),
    viwes

    序列化
    BookSerializers
    class BookModelSerializers(serializers.ModelSerializer):
    class Meta:
    model = Book
    fields = "__all__"


    class
    BookViewSet(viewsets.ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializers
    viwes.py

    from rest_framework import viewsets

    from myapp.utils import TokenAut

    class AuthorModelView(viewsets.ModelViewSet):
        authentication_classes = [TokenAuth,]
        permission_classes = []
        throttle_classes = []# 限制某个IP每分钟访问次数不能超过20次
        queryset = Author.objects.all()
        serializer_class = AuthorModelSerializers
    utils.py

    from
    rest_framework import exceptions from rest_framework.authentication import BaseAuthentication from .models import * class TokenAuth(BaseAuthentication): def authenticate(self,request): token = request.GET.get("token") token_obj = Token.objects.filter(token=token).first() if not token_obj: raise exceptions.AuthenticationFailed("验证失败123!") else: return token_obj.user.name,token_obj.token
        url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
        url(r'^authors/(?P<pk>d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor"),
    序列化
    
    class AuthorModelSerializers(serializers.ModelSerializer):
        class Meta:
            model = Author
            fields = "__all__"
    上面所有序列化
    
    # by luffycity.com
    
    from rest_framework import serializers
    
    from app01.models import *
    # 为queryset,model对象做序列化
    class PublishSerializers(serializers.Serializer):
        name = serializers.CharField()
        email = serializers.CharField()
    
    
    class PublishModelSerializers(serializers.ModelSerializer):
        class Meta:
            model=Publish
            fields="__all__"
    
    
    
    
    # class BookSerializers(serializers.Serializer):
    #     title = serializers.CharField(max_length=32)
    #     price = serializers.IntegerField()
    #     pub_date = serializers.DateField()
    #     publish=serializers.CharField(source="publish.name")
    #     #authors=serializers.CharField(source="authors.all")
    #     authors = serializers.SerializerMethodField()
    #     def get_authors(self,obj):
    #         temp=[]
    #         for obj in obj.authors.all():
    #             temp.append(obj.name)
    #         return temp
    
    '''
    序列化BookSerializers(book_list,many=True)过程:
         temp=[]
         for obj in book_list:
             temp.append({
                "title":obj.title,
                "price":obj.price,
                "pub_date":obj.pub_date,
                "publish":str(obj.publish), # obj.publish.name
                #"authors":obj.authors.all,
                "authors": get_authors(obj)
             })
    
    '''
    
    
    class BookModelSerializers(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = "__all__"
    
        #publish=serializers.CharField(source="publish.pk")
        publish=serializers.HyperlinkedIdentityField(
                view_name="detailpublish",
                lookup_field="publish_id",
                lookup_url_kwarg="pk",
    
        )
    
        # authors=serializers.CharField(source="authors.all")
        # authors = serializers.SerializerMethodField()
        # def get_authors(self,obj):
        #     temp=[]
        #     for obj in obj.authors.all():
        #         temp.append(obj.name)
        #     return temp
    
        def create(self, validated_data):
            print("validated_data",validated_data)
            book=Book.objects.create(title=validated_data["title"],price=validated_data["price"],pub_date=validated_data["pub_date"],publish_id=validated_data["publish"]["pk"])
            book.authors.add(*validated_data["authors"])
    
            return book
    
    
    class AuthorModelSerializers(serializers.ModelSerializer):
        class Meta:
            model = Author
            fields = "__all__"
  • 相关阅读:
    《构建之法》阅读笔记--2
    学习进度条--第九周
    团队冲刺第十天
    团队冲刺第十一天
    团队冲刺第九天
    团队冲刺第八天(4/29)
    团队冲刺第七天(4/28)
    团队冲刺第六天( 2016/4/27)
    第九章动手动脑
    第八章多态动手动脑
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11645537.html
Copyright © 2020-2023  润新知