drf自定义返回的外键类型:source+序列化器嵌套+model自定义字段

一. 序列化器单独放外键字段,

如果是不经过处理,会返回外键的id值

二. source

a. 适用于查询一个字段的 "teacher_name": "dbj",

b. 查询多个需要进行,写多个(不方便,如果是一层外键的话,我们一般用序列化器嵌套)

teacher_name = serializers.CharField(source='teacher.name')
teacher_id = serializers.CharField(source='teacher.id')

三. 序列化器嵌套,


a. 会把当前对象,需要的属性,以字典的形式返回

b. 序列化器名称必须是关联属性名称(外键名称)

c. 如果是多对一,不需要加任何参数,(课程多,老师一)站在多的一方看---(可以理解为正向)

d. 如果是一对多,需要在实例化对象的时候,加一个many=True且必须用related_name对应的值,作为序列化的名称---(可以理解为反向)----经测试这一句是假的,序列化名称可以随便起

e. related_name 详细介绍

related_name详细介绍https://blog.csdn.net/qq_52385631/article/details/122780202?spm=1001.2014.3001.5502

# 序列化器嵌套
class Teacher(serializers.ModelSerializer):
    class Meta:
        model = models.Teacher
        fields = ['id', 'name', 'get_role_display', 'title']


class CourseListModelSerializer(serializers.ModelSerializer):
    """课程列表序列化器"""

    teacher = Teacher()
    # teacher = Teacher(many=True) # 一对多

    class Meta:
        model = models.Course
        fields = ['id', 'name']

四. 如果是多层外键,获取数据

a. A-B-C,我们在A需要C的字段属性,那么一般不要序列化器嵌套,此时一般其所属的model自定义一个函数,

@property
    def get_course_lesson(self):
        # related_name--反向查询的时候使用,代替表名小写_set,直接到了objects这一层,如果A/B都在C处有外键,那么在C处的外键,必须related_name起一个别名
        course_lesson = self.course_lesson.filter(is_show_list=True).values('id', 'name', 'free_trail', 'lesson')
        return course_lesson

b. 在fields字段正常配置即可

class CourseListModelSerializer(serializers.ModelSerializer):
    """课程列表序列化器"""

    # 1.序列化器单独放外键字段,不经过处理,会返回id "teacher": 1,

    class Meta:
        model = models.Course
        fields = ['id', 'name', 'get_course_lesson']


五. 混用

# 知识点1 序列化器嵌套
class Teacher(serializers.ModelSerializer):
    class Meta:
        model = models.Teacher
        fields = ['id', 'name', 'get_role_display', 'title', 'signature']


class CourseListModelSerializer(serializers.ModelSerializer):
    """课程列表序列化器"""

    # 1.序列化器单独放外键字段,不经过处理,会返回id "teacher": 1,

    # 2.source 适用于查询一个字段的  # "teacher_name": "李老师",查询多个需要进行,写多个(不方便,如果是一层外键的话,我们一般用序列化器嵌套)
    # teacher_name = serializers.CharField(source='teacher.name')
    # teacher_id = serializers.CharField(source='teacher.id')
    # 3.序列化器嵌套,会把当前对象,需要的属性,以字典的形式返回
    # a. 序列化器名称必须是关联属性名称(外键名称),b. 如果是多对一,不需要加任何参数,如果是一对多,需要在序列化器加一个many=True且必须用related_name对应的值,作为序列化的名称
    teacher = Teacher()

    # 4. 如果是多层外键,A-B-C,我们在A需要C的字段属性,那么一般不要序列化器嵌套,此时一般其所属的model自定义一个函数,
    class Meta:
        model = models.Course
        fields = ['id', 'name', 'course_img', 'status', 'students', 'lessons', 'pub_lessons', 'price',
                  'attachment_path', 'teacher', 'get_course_lesson']

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑猪去兜风z1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值