First, knowledge
1、source
title = serializers.CharField(source='courses.title')
source for one2one, foreginkey, choices, and obtaining a result with a
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']
Results SerializerMethodField many2many and for obtaining a plurality of values (QuerySet)
3, depth (generally do not)
depth in accordance with the table of relations
When a larger amount of data, the front end of the developer to fetch data causes inconvenience
depth value 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
Second, examples:
models.py
from django.db Import Models # the Create your Models here Wallpaper. class Course, (models.Model): "" " curriculum " "" title = models.CharField (verbose_name = " Course Name " , max_length = 32 ) course_img = models.CharField (the verbose_name = " course picture " , MAX_LENGTH = 128 ) level_choices = ( ( . 1, ' primary ' ), ( 2, ' intermediate ' ), (3, ' Senior ' ) ) Level = models.IntegerField (verbose_name = " course rating " , choices = level_choices) DEF __str__ (Self): return self.title class CourseDetail (models.Model): "" " Course detail table " "" courses models.OneToOneField = (verbose_name = " curriculum " , to = " course, " , on_delete = models.CASCADE) slogan = models.CharField (verbose_name = " slogan " ,max_length=255) Why = models.CharField (verbose_name = " Why should we learn? " , Max_length = 255 ) recommend_courses = models.ManyToManyField (verbose_name = " recommended course " , to = " Course, " , the related_name = " rc " ) DEF __str__ (Self) : return self.courses.title class chapter (models.Model): "" " curriculum chapter table " "" NUM = models.IntegerField (verbose_name = " chapter ") 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
Serialization
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__'