首页 > 其他分享 >DRF-序列化

DRF-序列化

时间:2022-11-28 23:34:36浏览次数:39  
标签:validated serializers ser instance 序列化 data DRF

序列化

序列化:由于我们在数据库中获取的数据是queryset类型,无法向前端返回json,这一部分需要自己转换,rest的序列化可以提供这个关系转化。

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserGroupModel
        fields = '__all__'
        # fields = ['id','username','password']
        depth = 2       #该配置表示,如果字段是外键,那么是可以点出来的,这个数字就代表可以点出几层

class Group(APIView):
    #api;http://127.0.0.1:8002/app02/v1/group/3
    authentication_classes=[]
    permission_classes=[]
    throttle_classes=[]
    def get(self,request,*args,**kwargs):
        pk = kwargs.get('pk')
        groupinfo = UserGroupModel.objects.filter(id=pk).first()
        ser = GroupSerializer(instance=groupinfo,many=False)
        ret = json.dumps(ser.data,ensure_ascii=False)
        return HttpResponse(ret)

对想要的字段进行序列号,不想要的可以不写

from rest_framework import serializers

class BookSerializer(serializers.Serializer):
    name = serializers.CharField()  # 与模型层字段类型对应
    price = serializers.IntegerField()  # 与模型层字段类型对应

 常用的字段

BooleanField()
NullBooleanField()
CharField()
EmailField()
RegexField()
SlugField()
URLField()
UUIDField()
IPAddressField()
IntegerField()
FloatField()
DecimalField()
DateTimeField()
DateField()
TimeField()
ChoiceField()
FileField()
ImageField()

 

 

反序列化

Serializer类还可以帮我们把前端传来的数据进行校验后反序列化,并保存到数据库中。

模型层

class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.IntegerField()
#序列化类
class BookSerializer(serializers.Serializer): # 校验前端数据时name字段长度不能超过8位 name = serializers.CharField(max_length=8) price = serializers.IntegerField() # 新增数据,validated_data是符合条件的字段数据 def create(self, validated_data): book_obj = models.Book.objects.create(**validated_data) return book_obj # 修改数据,validated_data是符合条件的字段数据 # instance是要修改数据的对象 def update(self, instance, validated_data): # 修改name字段值 instance.name = validated_data.get('name') # 修改price字段值 instance.price = validated_data.get('price') instance.save() return instance

视图类

class BookAPIView(APIView):
    
    def post(self, request):
        # 前端数据传给data参数
        ser = BookSerializer(data=request.data)
        # 校验数据是否符合规范
        if ser.is_valid():
            ser.save()
            return Response({'msg':'添加成功'})
        return Response({'msg':'添加失败'})
    
    def put(self, request, bid):
        book_obj = models.Book.objects.filter(pk=bid).first()
        ser = BookSerializer(instance=book_obj, data=request.data)
        # 校验数据是否符合规范
        if ser.is_valid():
            ser.save()
            return Response({'msg':'修改成功'})
        return Response({'msg':'修改失败'})
  • 注意:
  • 保存到数据库中用的是Serializer类中的save()方法
  • 在使用save()方法前需要先使用is_valid()校验数据
  • 添加数据,Serializer类需要自行编写create()方法
  • 修改数据,Serializer类需要自行编写update()方法
  • 执行save()方法是会判断对象中是否有instance参数,无则执行create()方法,有则执行update()方法
  • validated_data是符合条件的字段数据
  • create()方法和update()方法需要返回新增的对象和修改后的对象

常见的方法和属

save() 保存到数据库
is_valid() 校验数据是否符合规范
errors 数据校验失败的原因
validated_data 符合条件的数据(只有is_valid()为True才有数据)
data 创建对象时传的数据
instance 创建对象时传的模型层对象

标签:validated,serializers,ser,instance,序列化,data,DRF
From: https://www.cnblogs.com/powfu/p/16934135.html

相关文章

  • 序列化和反序列化
    一、序列化:将Java对象转换成字节流的过程序列化过程:是指把一个Java对象变成二进制内容,实质上就是byte[]。因为序列化后可以把byte[]保存到文件中,或者把byte[]通过网络传......
  • DRF组件--2
    DRF组件--权限功能自己定义一个权限类,其中必须包含has_permission方法classMyPermission(object):#创建一个权限类。里面写具体的权限划分defhas_permissio......
  • DRF组件--认证
    DRF---认证功能自己定义一个认证类,其中类中必定要有authenticate方法classMyAuthentication():defauthenticate(self,request):token=request._reque......
  • DRF序列化
    DRF序列化目录DRF序列化序列化组件序列化序列化类的字段类型序列化类型的选项参数反序列化put反序列化需要实现序列器类父类的update方法反序列化校验read_only和write_on......
  • DRF前置及初识
    DRF前置及初识目录DRF前置及初识WEB应用(开发)模式API接口postman的使用Restful规范drf安装和使用CBV源码View源码APIView源码新request对象nullWEB应用(开发)模式API接口#......
  • DRF路由、认证、权限、频率
    DRF路由、认证、权限、频率目录DRF路由、认证、权限、频率路由原来直接在urls.py中直接.as_view()即可现在继承了ModelViewSet的视图类action的使用认证源码写认证类认证......
  • DRF过滤、排序、异常处理、自定义Response、分页
    DRF过滤、排序、异常处理、自定义Response、分页目录DRF过滤、排序、异常处理、自定义Response、分页过滤局部过滤排序异常处理封装Response对象分页三种分页方式PageNumb......
  • Newtonsoft.Json null值不序列化
    varjSetting=newJsonSerializerSettings{NullValueHandling=NullValueHandling.Ignore};varjson=JsonConvert.SerializeObject(response,Formatting.Indented,j......
  • mysql jdbc反序列化利用
    参考资料https://www.anquanke.com/post/id/203086按照资料描述搭建环境,注意,如果使用8.0.28版本的mysql,服务端MySQL_Fake_Server会报错(ValueError('45isnotavalidCha......
  • Java 序列化工具
    一、Java自带的序列化Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据......