zoukankan      html  css  js  c++  java
  • DRF组件的使用和接口设计

    一.序列化组件的使用及接口设计

    1.通过序列化组件进行get和post接口设计

      创建models.py

    from django.db import models
    
    # Create your models here.
    
    class Author(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        age = models.IntegerField()
        def __str__(self):
            return self.name
    
    class Publish(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        city = models.CharField(max_length=32)
        email = models.EmailField()
    
        def __str__(self):
            return self.name
    
    class Book(models.Model):
        nid = models.AutoField(primary_key=True)
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=5,decimal_places=2)
    
        publish = models.ForeignKey(to="Publish",related_name="book",related_query_name="book_query",on_delete=models.CASCADE)
        authors = models.ManyToManyField(to="Author")

      urls.py

    from django.contrib import admin
    from django.urls import path,re_path,include
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('books/', views.BookView.as_view()),
    ]

      app_serializers.py

    from rest_framework import serializers
    
    
    # 第二步, 创建一个序列化类,字段类型不一定要跟models的字段一致
    class BookSerializer(serializers.Serializer):
        # nid = serializers.CharField(max_length=32)
        title = serializers.CharField(max_length=128)
        price = serializers.DecimalField(max_digits=5, decimal_places=2)
        publish = serializers.CharField()
        # 外键字段, 显示__str__方法的返回值
        publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
        publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')
        # authors = serializers.CharField(max_length=32) # book_obj.authors.all()
    
        # 多对多字段需要自己手动获取数据,SerializerMethodField()
        authors_list = serializers.SerializerMethodField()
    
        def get_authors_list(self, book_obj):
            author_list = list()
    
            for author in book_obj.authors.all():
                author_list.append(author.name)
    
            return author_list
    
        def create(self, validated_data):
            # {'title': 'Python666', 'price': Decimal('66.00'), 'publish': '2'}
            validated_data['publish_id'] = validated_data.pop('publish')
            book = Book.objects.create(**validated_data)
    
            return book

      view.py

    
    

      from rest_framework.views import APIView
      from rest_framework.response import Response

    
    

      from .models import (
        Book,
        Publish,
        Author,
      )
      from .app_serializers import BookSerializer


    class
    BookView(APIView): def get(self, request): # 第三步,获取queryset origin_data = Book.objects.all() # 第四步,开始序列化 serialized_data = BookSerializer(origin_data, many=True) return Response(serialized_data.data) def post(self, request): verified_data = BookSerializer(data=request.data) if verified_data.is_valid(): book = verified_data.save() authors = Author.objects.filter(nid__in=request.data['authors']) book.authors.add(*authors) return Response(verified_data.data) else: return Response(verified_data.errors)

    总结:
      1. serializers.Serializer无法插入数据,只能自己实现create
      2. 字段太多,不能自动序列化

    2.通过序列化组件进行get单条数据和put,delete接口设计

      get单条数据接口设计

        1. 定义url
        2. 获取数据对象
        3. 开始序列化:serialized_data = BookSerializer(book_obj, many=False)
        4. 返回数据:serialized_data.data

      put数据接口设计
        1. 定义url
        2. 获取数据对象
          2.1 book_obj = Book.objects.get(pk=1)
        3. 开始序列化(验证数据,save())
          3.1 verified_data = BookSerializer(instance=book_obj, many=False)
        4. 验证成功写入数据库,验证失败返回错误
          4.1 verified_data.is_valid()

       deltet数据接口设计

        1.定义url

        2.获取数据对象并删除

           Book.objects.get(pk=nid).delete()

      url.py

    from django.urls import re_path
    from serializer import views
    
    urlpatterns = [
        re_path(r'books/$', views.BookView.as_view()),
        re_path(r'books/(?P<pk>d+)/$', views.BookFilterView.as_view()),
    ]

      app_serializers.py

    from rest_framework import serializers
    
    from .models import Book
    
    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
    
            fields = ('title',
                      'price',
                      'publish',
                      'authors',
                      'author_list',
                      'publish_name',
                      'publish_city'
                      )
            extra_kwargs = {
                'publish': {'write_only': True},
                'authors': {'write_only': True}
            }
    
        publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
        publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')
    
        author_list = serializers.SerializerMethodField()
    
        def get_author_list(self, book_obj):
            # 拿到queryset开始循环 [{}, {}, {}, {}]
            authors = list()
    
            for author in book_obj.authors.all():
                authors.append(author.name)
    
            return authors

      view.py

    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    from .app_serializers import BookSerializer
    from .models import (
        Book,
        Publish,
        Author,
    )
    
    class BookFilterView(APIView):
        def get(self, request, nid):
            book_obj = Book.objects.get(pk=nid)
    
            serialized_data = BookSerializer(book_obj, many=False)
    
            return Response(serialized_data.data)
    
        def put(self, request, nid):
            book_obj = Book.objects.get(pk=nid)
    
            verified_data = BookSerializer(data=request.data, instance=book_obj)
    
            if verified_data.is_valid():
                verified_data.save()
                return Response(verified_data.data)
            else:
                return Response(verified_data.errors)
    
        def delete(self, request, nid):
            book_obj = Book.objects.get(pk=nid).delete()
    
            return Response()
  • 相关阅读:
    {转}每次从vss获取文件都是只读
    點擊按鈕后彈出新頁面導致原頁面CSS失效
    Mschat控件示例升级错误处理方法
    一个简单的使用EVP框架的加密过程 aes 128 ecb
    centos7的syslog知识点
    pam模块使用syslog日志调试
    Linux系统上的popen()库函数
    linux C语言 用openssl进行签名验签 --- 亲测2 sha256 sha512
    linux C语言 用openssl进行签名验签 --- 亲测 sha256 sha512
    k8s简介
  • 原文地址:https://www.cnblogs.com/chenxi67/p/10079476.html
Copyright © 2011-2022 走看看