zoukankan      html  css  js  c++  java
  • Django restframework

    一、总纲

    1、一切皆资源,操作既请求

    2、分析

    一个类(无参数)

    查所有数据    get          返回所有数据

    添加数据        post          返回添加的数据

    另一个类(含参数)

    查看某一条数据    get      返回这一条数据

    修改某一条数据         put      返回修改的这条数据

    删除某条数据       delete       返回None

    补充:

    url后面是方法名,当url匹配成功后,再执行方法

    三、Serializer

        class BookSerialize(serializers.Serializer):
            title = serializers.CharField(max_length=32)
            price = serializers.IntegerField()
            pub_date = serializers.DateField()
            # 外键
            publish = serializers.CharField(source="publish.name")
            # 多对多
            authors = serializers.SerializerMethodField()
    
            def get_authors(self, obj):
                temp = []
                for author in obj.authors.all():
                    temp.append(author.name)
                return temp
    Serializer

    四、ModelSerializer

    1、简介

    用法与ModelForm相似

    2、作用

    a、models表与序列化直接关联

    b、校验、保存、更新数据

    3、自定义字段

        publish = serializers.CharField(source="publish.name")
    
        def create(self, validated_data):
            print(validated_data)
            # {'publish': {'name': '1'}, 'title': 'swift', 'price': 99, 'pub_date': datetime.date(2018, 9, 10), 'authors': [<Author: tom>, <Author: alex>]}
            book = Book.objects.create(title=validated_data['title'], price=validated_data['price'],
                                       pub_date=validated_data['pub_date'], publish_id=validated_data['publish']['name'])
            book.authors.add(*validated_data['authors'])
            return book
    外键+重写create方法

    4、Hyperlink

    目的:自定义字段产生link,通过该link,访问某个对应的某个数据

    path('publish/<publish_id>/', views.PublishDetailView.as_view(), name="publish_detail"),
    class BookModelSerialize(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = '__all__'
    
        publish = serializers.HyperlinkedIdentityField(
            # url的别名
            view_name="publish_detail",
            # 对应表的字段
            lookup_field="publish_id",
            # url的参数
            lookup_url_kwarg="publish_id"
        )
    模型序列化

    Add `context={'request': request}` when instantiating the serializer

    BookModelSerialize(book_list, many=True, context={'request': request})

    五、例子

    1、配置文件

    restframwork相当于app

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',
        'rest_framework',
    ]
    setting.py

    2、模型(储存表关系)

    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", on_delete=models.CASCADE)
        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
    models.py

    3、路由(CBV)

    urlpatterns = [
        path('admin/', admin.site.urls),
    
        path('books/', views.BookView.as_view()),
        path('books/<book_id>/', views.BookDetailView.as_view()),
    
        path('publish/', views.PublishView.as_view()),
        path('publish/<publish_id>/', views.PublishDetailView.as_view()),
    ]
    views.py

    4、模型序列化

    from rest_framework import serializers
    from app01.models import Author, Publish, Book
    
    
    # 作者表的序列化
    class PublishModelSerialize(serializers.ModelSerializer):
        class Meta:
            model = Publish
            fields = "__all__"
    
    
    class BookModelSerialize(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = '__all__'
    模型序列化

    5、视图

    from django.shortcuts import render, HttpResponse
    from rest_framework.views import APIView
    from app01.serialize import BookModelSerialize, PublishModelSerialize
    from app01.models import Author, Publish, Book
    from rest_framework.response import Response
    # Create your views here.
    
    
    class BookView(APIView):
        # 查看书籍, 返回所有数据(书籍信息)
        def get(self, request):
            book_list = Book.objects.all()
            book_serialize = BookModelSerialize(book_list, many=True)
            # return HttpResponse(author_serialize.data)
            return Response(book_serialize.data)
    
        # 添加书籍,并返回改书籍的数据
        def post(self, request):
            # 反序列化
            book = BookModelSerialize(data=request.data)
            if book.is_valid():
                book.save()
                return Response(book.data)
            else:
                return Response(book.errors)
    
    
    class BookDetailView(APIView):
        # 查看某一部书,返回这本书
        def get(self, request, book_id):
            book_obj = Book.objects.filter(pk=book_id).first()
            book_serialize = BookModelSerialize(book_obj)
            return Response(book_serialize.data)
    
        # 修改书籍, 返回修改后的数据
        def put(self, request, book_id):
            book_obj = Book.objects.filter(pk=book_id).first()
            # 反序列化
            book = BookModelSerialize(book_obj, data=request.data)
            if book.is_valid():
                book.save()
                return Response(book.data)
            else:
                return Response(book.errors)
    
        # 删除书籍 返回None
        def delete(self, request, book_id):
            Book.objects.filter(pk=book_id).delete()
            return Response()
    
    
    class PublishView(APIView):
        # 查看出版社, 返回所有数据(出版社信息)
        def get(self, request):
            publish_list = Publish.objects.all()
            publish_serialize = PublishModelSerialize(publish_list, many=True)
            # return HttpResponse(author_serialize.data)
            return Response(publish_serialize.data)
    
        # 添加出版社,并返回该出版社的数据
        def post(self, request):
            # 反序列化
            publish = PublishModelSerialize(data=request.data)
            if publish.is_valid():
                publish.save()
                return Response(publish.data)
            else:
                return Response(publish.errors)
    
    
    class PublishDetailView(APIView):
        # 查看某一出版社,返回该出版社
        def get(self, request, publish_id):
            publish_obj = Publish.objects.filter(pk=publish_id).first()
            publish_serialize = PublishModelSerialize(publish_obj)
            return Response(publish_serialize.data)
    
        # 修改出版社, 返回修改后的数据
        def put(self, request, publish_id):
            publish_obj = Publish.objects.filter(pk=publish_id).first()
            # 反序列化
            publish = PublishModelSerialize(publish_obj, data=request.data)
            if publish.is_valid():
                publish.save()
                return Response(publish.data)
            else:
                return Response(publish.errors)
    
        # 删除出版社 返回None
        def delete(self, request, publish_id):
            Publish.objects.filter(pk=publish_id).delete()
            return Response()
    视图

     序列化补充

    https://www.cnblogs.com/wt7018/p/11530962.html

  • 相关阅读:
    python面向对象之类,对象
    面向对象简介
    序列化模块
    sys模块简单使用
    day26作业
    day22
    day21作业
    day21
    day20作业
    day20
  • 原文地址:https://www.cnblogs.com/wt7018/p/11456440.html
Copyright © 2011-2022 走看看