国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Django--DRf---序列化器:序列化器嵌套

這篇具有很好參考價值的文章主要介紹了Django--DRf---序列化器:序列化器嵌套。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

模型表:

from django.db import models

# Create your models here.

class StudentModel(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32,verbose_name='姓名')
    age = models.SmallIntegerField(verbose_name='年齡')
    class_mate_f = models.ForeignKey(to='ClassMateModel',on_delete=models.SET_NULL,null=True,
                                     related_name='students',related_query_name='students',db_constraint=False)

class ClassMateModel(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64,verbose_name='班級名')

class ClassMateDetail(models.Model):
    id = models.AutoField(primary_key=True)
    address = models.CharField(max_length=32,verbose_name='地址')
    class_mate_f = models.ForeignKey(to='ClassMateModel',on_delete=models.CASCADE,null=True,
                                     related_name='detail',related_query_name='detail',db_constraint=False)

class TeacherModel(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32,verbose_name='姓名')
    age = models.SmallIntegerField(verbose_name='年齡')
    phone = models.CharField(max_length=13,verbose_name='手機號碼')
    class_mate_f = models.ManyToManyField(to='ClassMateModel',null=True,
                                          related_name='teachers',related_query_name='teachers',db_constraint=False)

#通過其他三張表的related_name 后,ClassMateModel就多了三個虛擬字段:students,teachers,detail

Django--DRf---序列化器:序列化器嵌套

一、外鍵在的一方

1、方式一:通過source來獲取指定字段數(shù)據(jù) 【一對多和一對一的】

1.1、一對多 外鍵方
序列化器:
class StudentModelSerializer(serializers.ModelSerializer):
    class_mate_pk = serializers.CharField(source='class_mate_f.id')
    class_mate_name = serializers.CharField(source='class_mate_f.name')
    class Meta:
        model = models.StudentModel
        fields = ['id','name','class_mate_pk','age','class_mate_name']
        
 
視圖函數(shù):
#學生創(chuàng)建
class StudentGenericAPIView(GenericAPIView):
    authentication_classes = []
    queryset = models.StudentModel.objects.all()
    serializer_class = serializer.StudentModelSerializer
    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})
1.2、多對多 外鍵方 【不適應】

2、方式二:通過外鍵=序列化類() 【適用所有關系】

2.1、多對多:外鍵在這里

序列化器:

class ClassMateForTeacherModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.ClassMateModel
        fields = ['id','name']

class TeacherModelSerializer(serializers.ModelSerializer):
    class_mate_f = ClassMateForTeacherModelSerializer(many=True)
    class Meta:
        model = models.TeacherModel
        fields = ['id','name','age','phone','class_mate_f']

視圖類:

class TeacherGenericAPIView(GenericAPIView):
    queryset = models.TeacherModel.objects.all()
    serializer_class = serializer.TeacherModelSerializer

    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})
2.2、一對多,外鍵方 【學生表,嵌套班級】
序列化器:
class ClassMateForStudentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.ClassMateModel
        fields = ['id','name']

class StudentModelSerializer(serializers.ModelSerializer):
    class_mate_f = ClassMateForStudentModelSerializer(read_only=True)
    class Meta:
        model = models.StudentModel
        fields = ['id','name','class_mate_f','age']
        
        
視圖:
class StudentGenericAPIView(GenericAPIView):
    authentication_classes = []
    queryset = models.StudentModel.objects.all()
    serializer_class = serializer.StudentModelSerializer
    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})

3、方式三:通過depth 【適用所有關系】

起始表–外鍵-------------> 表1-外鍵--------------> 表2–外鍵------------->表3

這樣,depth=4 ,會一直追蹤外鍵,直達表中沒有外鍵字段。

3.1、一對多:學生表- -外鍵----->班級表
#序列化器
class StudentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.StudentModel
        fields = ['id','name','class_mate_f','age']
        depth = 2 #等于表數(shù)

#視圖 
class StudentGenericAPIView(GenericAPIView):
    authentication_classes = []
    queryset = models.StudentModel.objects.all()
    serializer_class = serializer.StudentModelSerializer
    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})
3.2、多對多:老師-外鍵------->班級
#序列化器
class TeacherModelSerializer(serializers.ModelSerializer):
    # class_mate_f = ClassMateForTeacherModelSerializer(many=True,read_only=True)
    class Meta:
        model = models.TeacherModel
        fields = ['id','name','age','phone','class_mate_f']
        depth =2 #涉及到的表數(shù)量
   
#視圖
class TeacherGenericAPIView(GenericAPIView):
    queryset = models.TeacherModel.objects.all()
    serializer_class = serializer.TeacherModelSerializer

    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})
        

二、外鍵不在的一方[查詢班級為例子]

【只能使用序列化器嵌套的方式】

注意:反向查詢,都是通過反向查詢字段=序列化器(many=True)

在這四張表中:ClassMateModel是沒有一個外鍵字段,但是其他三張表都有ClassMateModel外鍵,

通過related_name, 在子查詢時,就可以通過設置好的名字進行跨表,而且也查詢結果是多個時也不需要使用_set了;

query_related_name 在聯(lián)表查詢時,通過設置好的名字進行跨表操作。

在查詢班級信息時,需要班級詳情信息、學生信息、老師信息;下面通過序列化器嵌套來實現(xiàn)

視圖:

class ClassMateGenericAPIView(GenericAPIView):
    authentication_classes = []
    queryset = models.ClassMateModel.objects.all()
    serializer_class = serializer.ClassMateModelSerializer
    def get(self,request):
        ser = self.get_serializer(instance = self.get_queryset(),many=True)
        return Response({'code':200,'data':ser.data})

序列化器:

#老師
class TeacherForClassMateMdoelserializer(serializers.ModelSerializer):
    class Meta:
        model = models.TeacherModel
        fields = ['id','name','phone']

#班級詳情
class ClassDetailForClassMateModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.ClassMateDetail
        fields =['address']

#學生
class StudentForClassMate(serializers.ModelSerializer):
    class Meta:
        model = models.StudentModel
        fields = ['name','age']

#班級
class ClassMateModelSerializer(serializers.ModelSerializer):
    teachers = TeacherForClassMateMdoelserializer(many=True,read_only=True)
    detail = ClassDetailForClassMateModelSerializer(many=True,read_only=True)
    students = StudentForClassMate(many=True,read_only=True)
    class Meta:
        model = models.ClassMateModel
        fields =['id','name','teachers','students','detail']
        extra_kwargs = {
            'id':{'read_only':True},
            'teachers':{'read_only':True},
            'detail':{'read_only':True},
            'students':{'read_only':True},
        }

總結
1、通過related_name , ClassMateModel 相當于多了,students、teachers和detail 三個字段。
2、使用這三個字段來接收序列器對象,就可以實現(xiàn)序列化嵌套了。
3、注意,在實例化序列化器時,必須帶上many=True 不然會報錯?!疽驗橥怄I不在當前模型類中,所有可能會有多個數(shù)據(jù),即使是一對一的關系表,也要加many=true】
4、加上read_only=True ,不參與到反序列化中。如果該序列化器不參與反序列就無須寫。

總結
1、通過related_name , ClassMateModel 相當于多了,students、teachers和detail 三個字段。
2、使用這三個字段來接收序列器對象,就可以實現(xiàn)序列化嵌套了。
3、注意,在實例化序列化器時,必須帶上many=True 不然會報錯?!疽驗橥怄I不在當前模型類中,所有可能會有多個數(shù)據(jù),即使是一對一的關系表,也要加many=true】
4、加上read_only=True ,不參與到反序列化中。如果該序列化器不參與反序列就無須寫。文章來源地址http://www.zghlxwxcb.cn/news/detail-430220.html

到了這里,關于Django--DRf---序列化器:序列化器嵌套的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包