Django增删改查:普通序列化器,手动实现序列化器过程

本文介绍了如何使用Django和DRF创建Game模型的序列化器,实现查询所有数据、单例操作、数据新增、更新和删除的RESTful API。通过GameSerializer和GameSerializer2,展示了ORM数据与JSON交互的关键步骤。
摘要由CSDN通过智能技术生成

序列化器

序列化: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__"  # 指定字段

编写视图

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

动态路由:删除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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值