django restframework 序列化高级用法指定序列化哪些字段
自定义序列化哪些字段
为什么需要这个功能呢,因为在工作中遇到了,不同的接口,需要返回的数据有很多都是相同的,只有个别几个字段数据不一样,那么解决方法如下
方法一,直接写不同的多个序列化器然后进行序列化,这个方法虽然说可以实现,但是需要些很多重复的代码,很不优雅。
具体步骤省略(重点不在这个上面)
方法二,把多个序列化器整合到一个序列化器中,因为他们都要很多共同的字段需要序列化,那么直接把他们都写在一个序列化中,然后再使用序列化器的时候,告诉他我们要序列化的字段,那么就可以实现一个序列化器,可以根据不同需求返回不同的数据,从而实现代码的优化。下面是具体步骤
步骤一首先就是再序列化器中重写init方法,
因为再正常的序列化器中,他是不能直接使用fields参数的,所以需要我们自己进行重写再序列化的的时候最重要的就是self.fields这个属性,这个属性是序列化器中所写的所有字段。所有对他进行修改即可实现我们想要的效果。
源码分析
class TestSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
fields = kwargs.pop('fields', None)
super().__init__(*args, **kwargs)
if fields:
allowed = set(fields)
existing = set(self.fields.keys())
for field_name in existing - allowed:
self.fields.pop(field_name)
"""攻击防御动态序列化类"""
time = serializers.DateTimeField(source='create_time')
class Meta:
model = Test
fields = ['time', 'id', 'username']
#使用方式
TestSerializer(instance,fields=['time']).data
#输出的结果就只会有
#('time', '2023-07-24 21:34:01')