首页 > 其他分享 >自定义钩子

自定义钩子

时间:2023-11-08 15:22:47浏览次数:40  
标签:name 自定义 field 钩子 self ret instance data

class BaseSerializer(Field):
	@property
    def data(self):
        if not hasattr(self, '_data'):
            if self.instance is not None and not getattr(self, '_errors', None):
                self._data = self.to_representation(self.instance)
            elif hasattr(self, '_validated_data') and not getattr(self, '_errors', None):
                self._data = self.to_representation(self.validated_data)
            else:
                self._data = self.get_initial()
        return self._data

class Serializer(BaseSerializer, metaclass=SerializerMetaclass):
	@property
    def data(self):
        ret = super().data
        return ReturnDict(ret, serializer=self)
    def to_representation(self, instance):
        """
        Object instance -> Dict of primitive datatypes.
        """
        ret = OrderedDict()
		#内部会执行bind方法
        fields = self._readable_fields #找到所有的字段,然后筛选出可读的(可序列化的)。

        for field in fields:
		if hasattr(self, 'nb_%s' % field.field_name):
			value = getattr(self, 'nb_%s' % field.field_name)(instance)
			retret[field.field_name]=value
		else:
			attribute = field.get_attribute(instance)
			ret[field.field_name] = field.to_representation(attribute)
        return ret
class ModelSerializer(Serializer):
class NbModelSerializer(serializers.ModelSerializer):
    gender=serializers.SerializerMethodField()
    class Meta:
        model=models.Role
        fields=["id","name","age","gender"]
		extra_kwargs={
		"id":{"read_inly":True}
		}
	def get_gender(self,obj):
		return obj.get_gender_dispalay()
		
ser = NbModelSerializer(instance=对象)
ser.data

ser= NbModelSerializer(data=request.data)
if ser.is_valid():
	ser.save()
	ser.data

#老师讲的码源也一脸蒙 所以先死记下来
#老师推荐的自定的方法
from collections import OrderedDict
from rest_framework.fields import SkipField
from rest_framework.relations import PKOnlyObject


class NbHookSerializer(object):

    def to_representation(self, instance):
        ret = OrderedDict()
        fields = self._readable_fields

        for field in fields:
            if hasattr(self, 'nb_%s' % field.field_name):
                value = getattr(self, 'nb_%s' % field.field_name)(instance)
                ret[field.field_name] = value
            else:
                try:
                    attribute = field.get_attribute(instance)
                except SkipField:
                    continue

                check_for_none = attribute.pk if isinstance(attribute, PKOnlyObject) else attribute
                if check_for_none is None:
                    ret[field.field_name] = None
                else:
                    ret[field.field_name] = field.to_representation(attribute)

        return ret

标签:name,自定义,field,钩子,self,ret,instance,data
From: https://www.cnblogs.com/bxj123/p/17817475.html

相关文章

  • Unity 自定义Postprocess BSC明度饱和度对比度
    前言本篇将介绍如何通过添加RenderFeature实现自定义的postprocess——调整屏幕的明度、饱和度、对比度(以下统称BSC)关于RenderFeature的基础可以看这篇https://www.cnblogs.com/chenglixue/p/17816447.htmlShaderBrightness:很简单乘以rendertargettexture即可Saturatio......
  • element-plus 动态自定义主题颜色
    颜色的HEX格式颜色的HEX格式是#+六位数字/字母,其中六位数字/字母是一种十六进制的表达方式。这六位分别两个一组,从左到右分别表示红、绿、蓝。00表示最小,十进制是0;FF表示最大,十进制是255。通俗点讲,某个颜色的数值越大,包含这个颜色就越多。如:#000000-黑色、#FFFFFF-白色、#FF0000-......
  • @RequestBody接收Json参数 用自定义注解对Vo对象中Date类型日期格式校验
    @RequestBody接收Json参数|用自定义注解对Vo对象中Date类型日期格式校验问题描述昨天测试的同事测试接口的时候,测试出来一个Date类型校验问题。要求输入的日期格式是:yyyy-MM-ddHH:mm:ss,Vo中使用的注解如下:@DateTimeFormat(pattern=”yyyy-MM-ddHH:mm:ss”)测试同事输入下面两种......
  • 让自定义的容器,也能基于范围循环
      C++11起,引入了基于范围的for循环这一特性,有什么好处呢?它有时可以大大地简化遍历容器的操作,比如说STL的vector。std::vectorv{1,2,3};std::vector<int>::iteratorit=begin(v);for(;it!=end(v);++it)std::cout<<*it<<'\n';  这是使用了迭代器的写法,......
  • 通过计算巢轻松部署ROS自定义资源
    概述阿里云资源编排服务ROS(ResourceOrchestrationService)可以帮助您简化云计算资源的管理。遵循ROS定义的模板规范,您可以定义所需云计算资源的集合及资源间的依赖关系。ROS可以自动完成所有资源的创建和配置,实现自动化部署和运维。ROS不仅能够编排阿里云资源,还支持自定义资源......
  • byte[]、list<byte>数组类型的几个自定义扩展方法
    byte[]、list<byte>数组类型的几个自定义扩展方法。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;namespaceiPublic.类型扩展方法{///<summary>///类型的扩展方法,用起来方便的///修改记录:///20230415,海......
  • bitsdojo_window自定义导航以及关闭按钮
    1、Windows里面的配置在应用程序文件夹中,转到windows\runner\main.cpp,并在文件开头添加以下两行:#include<bitsdojo_window_windows/bitsdojo_window_plugin.h>autobdw=bitsdojo_window_configure(BDW_CUSTOM_FRAME|BDW_HIDE_ON_STARTUP);2、macOS里面的配置1、在应用程......
  • 界面组件Telerik UI for WinForms中文教程 - 如何自定义应用程序文件窗口?
    TelerikUIforWinForms包含了一个高度可定制的组件,它取代了.NET中默认的OpenFileDialog。在下一个更新版本中,会发布一个向对话框浏览器提那家自定义位置的请求功能,本文演示了这个和另一个自定义功能,它可以帮助用户在浏览文件夹时快速选择最后修改的文件,自定义将根据最近的日期/......
  • Linux Vim批量注释和自定义注释
    使用Vim编辑Shell脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符"#"再退回命令模式,非常麻烦。连续行的注释其实可以用替换命令来完成。换句话说,在指定范围行加"#"注释,可以使用":起始行,终止行s/^/#/g",例如::1,10s/^/#/g表示在第1~10行行首加"#......
  • 通过mybatis-plus的自定义拦截器实现控制 mybatis-plus的全局逻辑删除字段的控制 (修改
    需求:过滤部分请求不实现mybatis-plus的逻辑删除看到网上关于mybatis-plus的自定义拦截器的文章有的少想了想自己写了一篇欢迎参考指正通过springboot的拦截器在请求进来时标记需要实现的需求的逻辑importlombok.Data;@DatapublicclassSyncBo{privateBoolean......