Django 序列化器

序列化器-Serializer

作用:

1. 序列化,序列化器会把模型对象转成字典,经过response以后变成json字符串
2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型
3. 反序列化,完成数据校验功能

Serializer序列化

# 声明序列化器
from rest_framwork import serializer
# 所有的自定义序列化器必须直接或间接继承于 serializers.serializer
"""
在drf中,对于客户端提交的数据,往往需要验证数据的有效性,准确性。这部分代码写在序列化器中的。
在序列化器中,已提供三个地方给我们针对客户端提交的数据进行验证。
	1. [内置选项] 字段声明的小圆括号中,已选项存在作为校验
	2. [自定义方法] 在序列化器中作为对象方法来提供验证[这部分验证的方法,必须以"validate_<字段>" 或者 "validate" 作为方法名]
	3. [自定义函数] 在序列化器外部,提前声明一个验证代码,然后在字段声明的小圆括号中,通过"validators=[验证函数1,验证函数2....]"
"""

# 自定义验证函数
def check_name(data):
    if data == "luffy":
        raise serializers.ValidationError("用户名不能是luffy")
     return data

class productsSerializer(serializers.Serializer):
    # 1.声明字段【要转换的字段, 当然,如果写了第二部分代码,有时候也可以不声明】
    name = serializers.CharField(max_lenght=100, validators=[check_name])
    # 2.可选【如果序列化器继承的是ModelSerializer,则需要声明对应的模型和字段】
    # 3.可选 【用于对客户端提交的数据进行验证】
    """验证单个字段的数据"""
    def validate_name(self, data):
        if data == "root":
            raise serializers.ValidationError("当前字段不能叫root")
        # 验证方法中结束时必须返回本次验证的内容
        return data
    """验证多个字段的数据"""
    def validate(self, data_dict)  # 表示客户端提交的所有数据
    	# 从数据中提取要验证的字段
        name = data_dict.get("name")
        if name="aaa":
            raise serializers.ValidationError("该名称不可使用")
        return data_dict
    # 4.可选 【用于把通过验证的数据进行数据库操作,保存到数据库】
    """
    在完成数据验证以后,drf提供了request和response来接收和返回数据。
    	1. create
    	2. update
    """
    def create(self,validate):
        """接收客户端提交的新增数据"""
        name = validate.get("name")
        age = validate.get("age")
        instance = 模型.object.create(name=name,age=age)
        return instance
    
    def update(self,instance,validated_data):
    	"""用户在反序列化中对于验证完成的数据进行保存更新"""
    	name = validate.get("name")
        age = validate.get("age")
    	instance.name = name
    	instance.age = age
    	instance.save()
    	return instance

view视图

# 使用序列化器进行数据的序列化操作
# 序列化转换一条数据;模型转换成字典 

class productsView(view):
    def get(self, request, pk):
        # 1.接收客户端的参数
        products = Products.object.get(pk=pk)
        # 2. 转换数据格式 实例化序列化器类
        # productsSerializer(模型对象或者模型列表,客户端提交的数据,额外要传递到序列化器中使用的数据)
        serializer = productsSerializer(instance=products)
        # 3. 获取序列化器转换的结果
        data = serializer.data
        
    def getlist(self, request):
        products_list = Products.object.all()
        # 序列化器转换多个数据
        # many = true 表示本次序列化器转换如果有多个模型对象列参数,必须声明Many=True
        serializer = productsSerializer(products_list, many_True)
        
   	def post(self,request):
        # 拿到数据字符串
        data = request.body.decode()
        # 把数据转成字典
        import json
        data_dict = json.loads(data)
        # 客户端提交数据时,对数据进行校验
        serializer = productsSerializer(data=data_dict)
        # 调用序列化器进行实例化
        # is_valid 在执行的时候,会自动先后调用;字段的内置选项-->自定义的验证方法-->自定义验证函数
        # 调用序列化器中写好的验证代码
        # raise_exception=True 抛出验证错误信息,并阻止代码继续往后运行
       	serializer.is_valid(raise_exception=True)
       	
       	# save表示让序列化器开始执行反序列代码。 也就是执行create和update代码
       	serializer.save()
        # 获取验证的错误信息
        print("错误信息:%s"%serializer.error_messages)
        
        # 获取被验证后的客户端数据
        print("验证后的数据:%S"% serializer.validated_data )
        return HttpResponse("ok")
	
	def put(self,request,pk):
		"""在更新中调用序列化器完成数据的更新操作"""
		date = 模型.objects.get(pk=pk);
		# 用户提交的数据
		date_dict = {}
		# 实例化序列化器
		productsSerializer(instance=date, data=date_dict)
		serializer.is_valid(raise_exception=True)
		instance = serializer.save()
		return HttpReponse("ok")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django序列化中,我们可以使用 `create()` 方法来插入数据到数据库中。在使用 `create()` 方法之前,需要先定义一个继承自 `serializers.ModelSerializer` 的序列化类,并且需要指定 `model` 和 `fields` 属性,例如: ```python from rest_framework import serializers from myapp.models import MyModel class MyModelSerializer(serializers.ModelSerializer): class Meta: model = MyModel fields = '__all__' ``` 在上面的代码中,我们定义了一个 `MyModelSerializer` 类,它继承自 `serializers.ModelSerializer`,并指定了 `model` 属性为 `MyModel`,`fields` 属性为 `__all__`,表示序列化会将 `MyModel` 的所有字段进行序列化。 接着,我们可以在视图中使用 `MyModelSerializer` 类来进行数据的插入操作。例如: ```python from rest_framework.views import APIView from rest_framework.response import Response from myapp.models import MyModel from myapp.serializers import MyModelSerializer class MyView(APIView): def post(self, request): serializer = MyModelSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400) ``` 在上面的代码中,我们定义了一个 `MyView` 类,它继承自 `APIView`,并在 `post()` 方法中使用 `MyModelSerializer` 类进行数据的反序列化和插入操作。`serializer.is_valid()` 方法用于验证反序列化后的数据是否合法,如果合法,则使用 `serializer.save()` 方法将数据保存到数据库中,并返回保存后的数据和状态码。如果数据不合法,则返回错误信息和状态码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值