zoukankan      html  css  js  c++  java
  • 视图与序列化传参

    # 1)在视图类中实例化序列化对象时,可以设置context内容
    # 2)在序列化类中的局部钩子、全局钩子、create、update方法中,都可以用self.context访问视图类传递过来的内容
    
    
    # 需求:
    # 1) 在视图类中,可以通过request得到登陆用户request.user
    # 2) 在序列化类中,要完成数据库数据的校验与入库操作,可能会需要知道当前的登陆用户,但序列化类无法访问request
    # 3) 在视图类中实例化序列化对象时,将request对象传递进去

    视图层:views.py

    class Book(APIView):
        def post(self, request, *args, **kwargs):
            book_ser = serializers.BookModelSerializer(data=request_data,context={'request':request})
            book_ser.is_valid(raise_exception=True)
            book_result = book_ser.save()
            return Response({
                'status': 0,
                'msg': 'ok',
                'results': serializers.BookModelSerializer(book_result).data
            })

    序列化层:serializers.py

    class BookModelSerializer(ModelSerializer):
        class Meta:
            model = models.Book
            fields = ('name', 'price')
        def validate_name(self, value):
            print(self.context.get('request').method)
            return value

    总结:context属性是在BaseSerializer中初始化好的 

    class BaseSerializer(Field):
       
        def __init__(self, instance=None, data=empty, **kwargs):
            self.instance = instance
            if data is not empty:
                self.initial_data = data
            self.partial = kwargs.pop('partial', False)
            self._context = kwargs.pop('context', {})    #是一个字典   因此在外部实例化时可以调用
            kwargs.pop('many', None)
            super().__init__(**kwargs)
    万般皆下品,唯有读书高!
  • 相关阅读:
    关于AFNetworking访问网络超时的设置
    【iOS程序启动与运转】- RunLoop个人小结
    iOS开发中常用到的加密方式
    iOS开发路线简述
    iOS中多线程的实现方案
    HTTP原理
    浅析无线定位技术
    iOS-MVVM设计模式
    打造强大的BaseModel(1):让Model自我描述
    介绍一个基于jQuery的Cookie操作插件
  • 原文地址:https://www.cnblogs.com/s686zhou/p/11705872.html
Copyright © 2011-2022 走看看