zoukankan      html  css  js  c++  java
  • restful 序列化

    用rest_framework快速实现图书的增删改查操作

    一、创建django项目  并在setting.py下的installed_app中注册rest_framework;

    二、在models中创建数据模型:

    from django.db import models
    
    class Book(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=20)
        price = models.DecimalField(max_digits=5, decimal_places=2)
        publish = models.ForeignKey(to='Publish', to_field='id', on_delete=models.CASCADE)
        author = models.ManyToManyField(to='Author')
    
    
    class Publish(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=20)
        city = models.CharField(max_length=32)
        email = models.EmailField()
    
    
    class Author(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=20)
        age = models.IntegerField()
    View Code

    三、在views.py中(可以写到一个专门的序列化文件中)通过继承rest_framework下的serializers.ModelSerializer类来自定义序列化类:

    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = '__all__'
            # 指定要序列化的字段
            # fields=['nid','name']
            # 选择要排除的字段(注意,不能跟fields连用)
            # exclude=['name','price']
            # 深度,官方建议最多写10,建议最多写3
            depth = 1  
         # 局部钩子与全局钩子的使用,类似于form组件中的局部钩子于全局钩子
         # 局部钩子函数,对单个字段校验
         #校验name字段不能以sb开头
         #def validate_name(self,value):
         #    if value.startswith('sb'):
                 #不能让你过
         #        raise ValidationError('书名不能以sb开头')
         #   else:
         #       return value
    
         #全局钩子函数,对全局字段进行校验
         # def validate(self,a):
         #     # print(a)
         #     name=a.get('name')
         #     price=a.get('price')
         #     if name != price:
         #         raise ValidationError('错了')
         #     else:
         #         return a     
    View Code

     四、在views.py中通过来实现具体的增删改查:

    from django.shortcuts import render, HttpResponse
    from rest_framework.response import Response
    from rest_framework import serializers
    from app01.models import *
    from rest_framework.views import APIView
    
    
    # class AuthorSerializer(serializers.ModelSerializer):
    #     class Meta:
    #         model = Author
    #         fields = '__all__'
    
    
    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = '__all__'
    
    
    
    class Booksview(APIView):
        def get(self, request, *args, **kwargs):
            respones = {'status': 100, 'msg': '查询成功'}
            book_list = Book.objects.all()
            book_ll = BookSerializer(instance=book_list, many=True)
            respones['data'] = book_ll.data
            return Response(respones)
    
        def post(self, request, *args, **kwargs):
            respones = {'status': 100, 'msg': '新增成功'}
            book = BookSerializer(data=request.data, many=False)
            if book.is_valid():
                book.save()
                respones['data'] = book.data
            else:
                respones['msg'] = book.errors
            return Response(respones)
    
    
    class Bookview(APIView):
        def get(self, request, pk, *args, **kwargs):
            respones = {'status': 100, 'msg': '查询成功'}
            book_list = Book.objects.filter(pk=pk)
            book_ll = BookSerializer(instance=book_list, many=True)
            respones['data'] = book_ll.data
            return Response(respones)
    
        def put(self, request, pk, *args, **kwargs):
            respones = {'status': 100, 'msg': '修改成功'}
            book = Book.objects.filter(pk=pk).first()
            book_ll = BookSerializer(instance=book, data=request.data)
            if book_ll.is_valid():
                book_ll.save()
                respones['data'] = book_ll.data
            else:
                respones['msg'] = book_ll.errors
            return Response(respones)
    
        def delete(self, request, pk, *args, **kwargs):
            book = Book.objects.filter(pk=pk).delete()
            return HttpResponse("")
    
    # 代码可精简
    View Code

    五、路由层urls的配置:

    #  django  2.x版本
    
    from django.contrib import admin
    from django.urls import path, re_path   # re_path相当于1.x版本中的url
    from app01 import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        re_path('^books/$', views.Booksview.as_view()),
        re_path('^books/(?P<pk>d+)', views.Bookview.as_view()),
    ]
    View Code
  • 相关阅读:
    Appium Inspector定位元素与录制简单脚本
    Appium(Python)API
    Appium(Python)驱动手机Chrome浏览器
    Appium(Python)驱动手机淘宝App
    uiautomatorviewer定位App元素
    Android Studio怎样创建App项目
    adb获取设备的序列号
    获取App的PackageName包名和LauncherActivity启动页
    怎样安装Appium
    最小生成树(MST)
  • 原文地址:https://www.cnblogs.com/peng-zhao/p/10602604.html
Copyright © 2011-2022 走看看