django restframework 序列化高级用法指定序列化哪些字段

发布时间 2023-07-26 15:49:04作者: clever-cat

自定义序列化哪些字段

为什么需要这个功能呢,因为在工作中遇到了,不同的接口,需要返回的数据有很多都是相同的,只有个别几个字段数据不一样,那么解决方法如下

方法一,直接写不同的多个序列化器然后进行序列化,这个方法虽然说可以实现,但是需要些很多重复的代码,很不优雅。

具体步骤省略(重点不在这个上面)

方法二,把多个序列化器整合到一个序列化器中,因为他们都要很多共同的字段需要序列化,那么直接把他们都写在一个序列化中,然后再使用序列化器的时候,告诉他我们要序列化的字段,那么就可以实现一个序列化器,可以根据不同需求返回不同的数据,从而实现代码的优化。下面是具体步骤

步骤一首先就是再序列化器中重写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')