
正文
restframework 序列化补充(自定义ModelSerializerl)
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
一、知识点
1、source
title = serializers.CharField(source='courses.title')
source用于one2one、foreginkey、choices,用与获取一个结果
2、SerializerMethodField
title = serializers.CharField(source='courses.title')
recommend_courses = serializers.SerializerMethodField()
chapter = serializers.SerializerMethodField() def get_recommend_courses(self, obj):
rc_list = obj.recommend_courses.all()
return [{'id': rc_obj.id, 'title': rc_obj.title} for rc_obj in rc_list] def get_chapter(self, obj):
query_set = obj.courses.chapter_set.all()
print("=============>", query_set) # <QuerySet [<Chapter: 基础语法>, <Chapter: 函数>, <Chapter: 面向对象>]>
return [{'id': obj.id, 'name': obj.name} for obj in query_set] class Meta:
model = CourseDetail
fields = ['id', 'slogan', 'why', 'title', 'recommend_courses', 'chapter']
SerializerMethodField用于many2many 和 获取的结果是多个值(queryset) 外键的反向查询
3、depth(一般不用)
depth 按照表的关系
当数据量较大时,给前端开发人员取数据造成了不便
depth值 0-10
class CourseDetailSerializer(serializers.ModelSerializer):
"""
课程细节序列化
"""
class Meta:
model = CourseDetail
# fields = ['id', 'slogan', 'why', 'title', 'recommend_courses', 'chapter'] fields = '__all__'
depth = 0
a、depth为0
b、depth为1
二、例子:
models.py
from django.db import models # Create your models here. class Course(models.Model):
"""
课程表
"""
title = models.CharField(verbose_name="课程名称", max_length=32)
course_img = models.CharField(verbose_name="课程图片", max_length=128)
level_choices = (
(1, '初级'),
(2, '中级'),
(3, '高级')
)
level = models.IntegerField(verbose_name="课程等级", choices=level_choices) def __str__(self):
return self.title class CourseDetail(models.Model):
"""
课程细节表
"""
courses = models.OneToOneField(verbose_name="课程表", to="Course", on_delete=models.CASCADE)
slogan = models.CharField(verbose_name="标语", max_length=255)
why = models.CharField(verbose_name="为什么要学?", max_length=255)
recommend_courses = models.ManyToManyField(verbose_name="推荐课程", to="Course", related_name="rc") def __str__(self):
return self.courses.title class Chapter(models.Model):
"""
课程章节表
"""
num = models.IntegerField(verbose_name="章节")
name = models.CharField(verbose_name="章节名称", max_length=32)
courses = models.ForeignKey(verbose_name="所属课程", to="Course", on_delete=models.CASCADE) def __str__(self):
return self.name
序列化
from api.models import Chapter, Course, CourseDetail
from rest_framework import serializers # class CourseSerializer(serializers.ModelSerializer):
"""
课程表序列化
"""
level = serializers.CharField(source="get_level_display") class Meta:
model = Course
fields = ['id', 'title', 'course_img', 'level'] class CourseDetailSerializer(serializers.ModelSerializer):
"""
课程细节序列化
"""
title = serializers.CharField(source='courses.title')
recommend_courses = serializers.SerializerMethodField()
chapter = serializers.SerializerMethodField() def get_recommend_courses(self, obj):
rc_list = obj.recommend_courses.all()
return [{'id': rc_obj.id, 'title': rc_obj.title} for rc_obj in rc_list] def get_chapter(self, obj):
query_set = obj.courses.chapter_set.all()
print("=============>", query_set) # <QuerySet [<Chapter: 基础语法>, <Chapter: 函数>, <Chapter: 面向对象>]>
return [{'id': obj.id, 'name': obj.name} for obj in query_set] class Meta:
model = CourseDetail
fields = ['id', 'slogan', 'why', 'title', 'recommend_courses', 'chapter'] class ChapterSerializer(serializers.ModelSerializer):
"""
课程章节序列化
"""
class Meta:
model = Chapter
fields = '__all__'






