APIView 怎么写?

前后端分离项目配置流程

1.创建项目和子应用。

2.配置项目:

INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    
        'game',  # 注册子应用
        'rest_framework',  # drf框架
        'corsheaders',  # 跨域
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'corsheaders.middleware.CorsMiddleware',  # 跨域中间件
    ]
    
    CORS_ORIGIN_ALLOW_ALL = True # 允许所有源访问
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': 'localhost',
            'PORT': 3306,
            'USER': 'root',
            'PASSWORD': 'root',
            'NAME': 'test',
        }
    }
    
    LANGUAGE_CODE = 'zh-Hans'
    
    TIME_ZONE = 'Asia/Shanghai';

3.安装数据库

4.编写模型类

5.迁移、注册表、创建超级用户、添加测试数据

6.路由分发

7.序列化器*

序列化:ORM操作的数据 -> JSON数据 查询

反序列化:JSON数据 -> ORM操作的数据 添加和修改

序列化器:用于实现序列化和反序列化的工具。

 # 在子应用下新建serializers.py文件
    from rest_framework import serializers  # 导入
    from game.models import Game
    
    # 定义一个普通序列化器,用于处理Game模型类相关的数据
    class GameSerializer(serializers.Serializer):
        # 映射字段
        id = serializers.IntegerField()  # 添加id字段
        name = serializers.CharField(max_length=20)
        kind = serializers.CharField(max_length=20)
        score = serializers.IntegerField()
        age = serializers.IntegerField()
    
        # 实现增加功能时需要实现create方法
        # validated_data时要添加的数据
        # ** 拆包
        def create(self, validated_data):
            result = Game.objects.create(**validated_data)
            return result  # 返回结果
    
        # 实现更新功能需要实现update方法
        # instance要更新的orm对象
        # validated_data去更新这个对象的数据
        def update(self, instance, validated_data):
            instance.id = validated_data.get('id')
            instance.name = validated_data.get('name')
            instance.kind = validated_data.get('kind')
            instance.score = validated_data.get('score')
            instance.age = validated_data.get('age')
            instance.save()  # 保存更新的数据
            # 修改数据2中方法 1.update 2.save
            return instance
    
    #######################################################################
    
    # 模型序列化器
    class GameSerializer2(serializers.ModelSerializer):
        class Meta:  # 配置元类
            model = Game   # 指定模型类
            fields = "__all__"  # 指定字段

8.编写视图*

使用序列化器实现增删改查操作。(查询所有数据、查询单个数据、增加一个数据、修改数据、删除一个数据)

动态路由:删除delete、修改put、查询单个数据get

静态路由:查询所有数据get、增加post

通过分析,使用2个类视图实现增删查改功能。

 # 使用序列化器会用到的参数:instance 实例ORM操作数据   data JSON数据
    # def func(instance, data)
    # 调用函数 位置参数: func(instance=a,data=b) -> func(a,b)  func(instance=a)-> func(a)
    # 调用函数 指定参数: func(data=a, instance=b)  func(data=a)  
    
    from django.shortcuts import render
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from game.models import Game
    from game.serializer import GameSerializer
    
    # Create your views here.
    # 实现游戏角色的查询全部 和 添加
    class GameView1(APIView):
        def get(self, request):  # 1
            # ORM操作数据 -》 json数据  序列化
            # 获取全部游戏信息 ORM操作数据
            games_data = Game.objects.all()
            # 使用序列化器,实现序列化
            # 多个数据需要加上 many=True
            ser = GameSerializer(games_data, many=True)
            # 注意返回的时ser.data 而不是ser
            return Response(ser.data)
    
    
        def post(self, request):  # 2 增加数据
            # request.data 就是前端提交的json数据
            # 1.使用序列化器进行反序列化,data参数就是要反序列化的数据
            ser = GameSerializer(data=request.data)
            # 2.校验  参数raise_exception=True,出现异常时自动抛出异常
            if ser.is_valid(raise_exception=True):
                # 3.保存
                ser.save()
                return Response({'msg':'添加数据成功'}, status=201)
            return Response({'msg': '添加数据失败'}, status=500)
    
    
    
    # 根据id 实现 单个 查询 修改 删除
    class GameView2(APIView):
        def get(self, request, id):  # 3
            # 根据id获取数据,单个数据
            try:
                game_data = Game.objects.get(id=id)
            except Exception as e:
                print(e)
                return Response({'msg':'数据不存在'}, status=404)
            ser = GameSerializer(game_data)
            return Response(ser.data, status=200)
    
        def put(self, request, id):  # 4 反序列化之更新
            # 1.获取要更新的数据 ORM操作的数据->instance
            try:
                game_data = Game.objects.get(id=id)
            except Exception as e:
                print(e)
                return Response({'msg':'数据不存在'}, status=404)
            # 2.反序列化 game_data要更新的orm对象 request.data去更新这个对象的数据
            ser = GameSerializer(instance=game_data, data=request.data)
            # 3.校验
            if ser.is_valid(raise_exception=True):
                # 4.保存
                ser.save()
                return Response({'msg':'更新数据成功'}, status=201)
            return Response({'msg':'更新数据失败'}, status=500)
    
        def delete(self, request, id):  # 5 删除
            try:
                Game.objects.filter(id=id).delete()
            except Exception as e:
                print(e)
                return Response({'msg': '删除失败'}, status=404)
            return Response({'msg': '删除数据成功'}, status=204)

总结:

1.序列化时,将模型类对象(ORM操作的数据)传入instance参数,返回结果时使用的是ser.data属性获取得到。

2.反序列创建时,将前端提交的数据(JSON数据)传给data参数,要使用is_valid进行校验,调用save进行保存。

3.反序列化更新是,将要更新的数据对象(ORM操作数据)传入instance参数,更新后的数据((JSON数据))传入data参数

4.数据多个时,记得加many=True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值