博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django Rest Framework --序列化、请求数据校验
阅读量:5222 次
发布时间:2019-06-14

本文共 4122 字,大约阅读时间需要 13 分钟。

序列化

基本代码结构

modles.py

1 from django.db import models 2 # Create your models here. 3  4 # Create your models here. 5 class UserGroup(models.Model): 6     title=models.CharField(max_length=32) 7  8 class UserInfo(models.Model): 9     user_type_choices=((1,'普通用户'),10                        (2,"VIP"),11                        (3,"SVIP"))12     user_type=models.IntegerField(choices=user_type_choices)13     group= models.ForeignKey('UserGroup',on_delete=models.CASCADE,null=True)14     roles=models.ManyToManyField('Role')15     username=models.CharField(max_length=32,unique=True)16     password=models.CharField(max_length=32)17 18 class UserToken(models.Model):19     user=models.OneToOneField(to='UserInfo',on_delete=models.CASCADE)20     token=models.CharField(max_length=64)21 22 class Role(models.Model):23     title=models.CharField(max_length=32)
models.py

urls.py

from django.conf.urls import url, includefrom web.views.s6_serializers import TestViewurlpatterns = [    url(r'test/', TestView.as_view(), name='test'),]

views.py

class UserinfoSerializer(ModelSerializer):    # user_type = serializers.CharField(source='get_user_type_display')    # role = serializers.SerializerMethodField()    #生成url    group=serializers.HyperlinkedIdentityField(view_name='gu',lookup_url_kwarg='xxx',lookup_field='group_id')    class Meta:        model=models.UserInfo        fields='__all__'        # fields=['id','username','user_type','role']        depth=1    # def get_role(self, row):    #     roles=row.roles.all()    #     dict=[]    #     for item in roles:    #         dict.append({'ID':item.id,"title":item.title})    #     return dictclass TestView(APIView):    def get(self,request,*args,**kwargs):        #方法一        # roles=models.Role.objects.all().values('id','title')        # roles=list(roles)        # ret=json.dumps(roles,ensure_ascii=False)        #方法二        # roles=models.Role.objects.all()        # ser=RoleSerializer(instance=roles,many=True)        # ret = json.dumps(ser.data, ensure_ascii=False)        uesr=models.UserInfo.objects.all()      #生成url时,必须添加context参数        ser=UserinfoSerializer(instance=uesr,many=True,context={'request': request})        ret = json.dumps(ser.data, ensure_ascii=False)        return HttpResponse(ret)

  源码分析

1.实例化Serializer对象时,many参数的作用?

我们从实例化入手,大家知道在实例化时,首先执行的是__new__方法,然后返回对应的对象实例,所以我们一步步深入,在BaseSerializer类中找到了__new__方法。

 

根据判断many参数的值,来确定我们需要返回的对象实例。

2.Serializer对象是如何序列化数据的?

从data方法入手,进入data方法,返回self._data,接着我们从最外层寻找to_repersertation方法。

3.如何反向生成url?

字段类型(HyperlinkedIdentityField)就是字段生成url,在上图中,进行第一次to_represention方法是返回的是一个对象。

 

在HyperlinkedIdentityField类的to_represention最后调用的是django内置的生成url的方法reverse。

请求数据校验

urls.py

from django.conf.urls import url, includefrom web.views.s6_serializers import TestViewurlpatterns = [    url(r'test/', TestView.as_view(), name='test'),]

 views.py

class PasswordValidator(object):    def __init__(self, base):        self.base = base    def __call__(self, value):        if value != self.base:            message = 'This field must be %s.' % self.base            raise serializers.ValidationError(message)    def set_context(self, serializer_field):        """        This hook is called by the serializer instance,        prior to the validation call being made.        """        # 执行验证之前调用,serializer_fields是当前字段对象        passclass UserSerializer(serializers.Serializer):    ut_title = serializers.CharField(source='ut.title')    user = serializers.CharField(min_length=6)    pwd = serializers.CharField(error_messages={'required': '密码不能为空'}, validators=[PasswordValidator('666')])            def validate_user (self,value):        print(value)        raise exceptions.ValidationError('拒绝你了!!!!')class TestView(APIView):    def post(self, request, *args, **kwargs):        # 验证,对请求发来的数据进行验证        ser = UserSerializer(data=request.data)        if ser.is_valid():            print(ser.validated_data)        else:            print(ser.errors)        return Response('POST请求,响应内容')  

 源码分析

1.实例化过程

将data赋值给initial_data

2.如果实现数据校验?

ser.is_valid()方法的返回值肯定是个bool值,进一步进入内部,看如何实现校验。

 

 

  

转载于:https://www.cnblogs.com/kxsph/p/10615912.html

你可能感兴趣的文章
用UL标签+CSS实现的柱状图
查看>>
mfc Edit控件属性
查看>>
Linq使用Join/在Razor中两次反射取属性值
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
优秀员工一定要升职吗
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
sql常见面试题
查看>>
jQuery总结第一天
查看>>
Java -- Swing 组件使用
查看>>
Software--Architecture--DesignPattern IoC, Factory Method, Source Locator
查看>>
poj1936---subsequence(判断子串)
查看>>
黑马程序员_Java基础枚举类型
查看>>
[ python ] 练习作业 - 2
查看>>
一位90后程序员的自述:如何从年薪3w到30w!
查看>>
在.net core上使用Entity FramWork(Db first)
查看>>
System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集...
查看>>
UIImage 和 iOS 图片压缩UIImage / UIImageVIew
查看>>