restframework complementary sequence of (custom ModelSerializerl)

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__'

 

Guess you like

Origin www.cnblogs.com/wt7018/p/11530962.html