drf中source的用法

文章详细介绍了DjangoRestFramework中Serializer类中source属性的三种用法:直接映射字段、跨表查询和通过模型方法获取动态值。展示了如何通过source改变前端展示的字段名及获取关联数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

source是序列化类中,字段类的属性,它有三种用法

用法一

from rest_framework import serializers

# 如下写法,就能修改序列化的字段
class BookSerializer(serializers.Serializer):
    # 用法一:最简单,拿表中的字段
        xxx = serializers.CharField(source='name')
 
    
# 前端看到:
    {
        "xxx": "西游记",
        "price": 199,
        "publish": "南京出版社"
    },

# 前端应该打印name  但是用了source之后,就将name 改为了xxx  
    如果改为 source= "price" ,  将会打印

     {
        "xxx": 199,
        "price": 199,
        "publish": "南京出版社"
    },

用法二:

# 如下写法,就能修改序列化的字段
class BookSerializer(serializers.Serializer):

    # 用法二 :跨表查询
    # publish = serializers.CharField(source='book.publish.name') # 因为在book表中,随意book可以去掉
    publish = serializers.CharField(source='publish.name') # 自动对应成出版社的名字 可以通过 .  跨表查询


原本前端看到
    
# 前端看到:
    {
        "name": "西游记",
        "price": 199,
        "publish": publish obj(1)   # 原本对应出版社的显示内容
    },


通过source跨表查询之后,得到出版社的名称
# 前端将看到
    {
        "name": "西游记",
        "price": 199,
        "publish": 南方出版社   # 跨表查询之后拿到的结果,数据库中对应的出版社的名称
    },

用法三

# 字段类的属性
# 如下写法,就能修改序列化的字段
class BookSerializer(serializers.Serializer):

    #用法三:这里涉及到两个地方,1 在表模型中写方法,  2 在序列化类中拿到返回值
    yyy = serializers.CharField(source='get_name')

    ### models.py中
    @property
    def get_name(self):
        return self.name+'sb'  # 这里返回什么,序列化类中就拿到什么,前端就看到什么
    
    
# 前端看到:
    {
        "xxx": "西游记",
        "yyy": "西游记sb",     # 这个就是通过source拿到的方法,返回过来的内容
        "price": 199,
        "publish": "南京出版社"
    },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值