首页 > 其他 > 详细

关于--学习DRF序列器--关联序列化

时间:2019-05-22 01:05:09      阅读:411      评论:0      收藏:0      [点我收藏+]

由于笔者在Django的Test文件下进行测试,因此,需要配置Django的环境标量

1 import os, json, django
2 #配置添加Django环境
3 if not os.environ.get("DJANGO_SETTINGS_MODULE"):
4     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "drf_demo.settings")
5 #启动Django环境
6 django.setup()

关联序列化输出有三种形式, 关联序列换输出:

  • 将关联对象序列化为关联对象的主键 | 
  • 将关联对象序列化为关联对象模型类__str__方法的返回值 | 
  • 使用指定的序列化器类将关联对象进行序列化 |

 

== 前提准备好<书>和<英雄>的模型类 ==

准备图书类序列器

 1 class BookInfoSerializer(serializers.Serializer):
 2     """图书序列器"""
 3     id = serializers.IntegerField(label="图书序号", read_only=True)
 4     btitle = serializers.CharField(label="图书标题", max_length=20)
 5     bpub_date = serializers.DateField(label="发行日期", required=False)
 6     bread = serializers.IntegerField(label="阅读量", required=False)
 7     bcomment  = serializers.IntegerField(label="评价量", required=False)
 8     # heroinfo_set = serializers.PrimaryKeyRelatedField(label="本书的英雄的id", many=True, read_only=True)
 9     # heroinfo_set = serializers.PrimaryKeyRelatedField(label="本书的英雄的id", many=True)
10 
11     #使用图书-英雄的隐形外键,使用输出形式为’__str__‘表达的形式
12     # heroinfo_set = serializers.StringRelatedField(label="本书的英雄", many=True, read_only=True)
13     # heroinfo_set = HeroInfoSerializer(label="本书的英雄", many=True)

 

准备英雄类序列器

 1 class HeroInfoSerializer(serializers.Serializer):
 2     "英雄序列器"
 3 
 4     GENDER_CHOICES = (
 5         (0, male),
 6         (1, female)
 7     )
 8 
 9     id = serializers.IntegerField(label="英雄序号", read_only=True)
10     hname = serializers.CharField(label="英雄名字", max_length=20)
11     hgender = serializers.ChoiceField(choices=GENDER_CHOICES, required=False)
12     hcomment = serializers.CharField(label="描述信息", required=False)
13     # hbook = serializers.StringRelatedField(label="属于哪本书")
14     # hbook = serializers.PrimaryKeyRelatedField(label="属于哪本书", read_only=True)
15     # hbook = BookInfoSerializer(label="属于哪本书")

 


 

I. 将关联对象序列化为关联对象的主键  >> 以图书为主表,查询关联的子表英雄表

  将“图书序列器”的中添加一行关联<英雄>的"主键"代码:

    heroinfo_set = serializers.PrimaryKeyRelatedField(label="本书的英雄的id", many=True, read_only=True) 

  然后运行测试代码:

  

if __name__ == __main__:
    books = BookInfo.objects.all()
    # 联序列化 使用序列化器关联 书>英雄
    serializer = BookInfoSerializer(books, many=True)
    #格式化输出
    format_data = json.dumps(serializer.data, indent=1, ensure_ascii=False)
    print(format_data)

   得到输出结果:[得到子集的内容,表示该书的英雄内容(用英雄主键pk表示)]

技术分享图片


 

II. 将关联对象序列化为关联对象模型类__str__方法的返回值

  将“图书序列器”的中添加一行关联<英雄>的"__str__"代码:

     1 heroinfo_set = serializers.StringRelatedField(label="本书的英雄", many=True, read_only=True) 

  然后运行测试代码:

1 if __name__ == __main__:
2     books = BookInfo.objects.all()
3     # 联序列化 使用序列化器关联 书>英雄
4     serializer = BookInfoSerializer(books, many=True)
5     #格式化输出
6     format_data = json.dumps(serializer.data, indent=1, ensure_ascii=False)
7     print(format_data)

   得到输出结果:[得到子集的内容,表示该书的英雄内容(用英雄类里面"__str__"打印的属性表示)]

 技术分享图片


 

III. 使用指定的序列化器类将关联对象进行序列化

  将“图书序列器”的中添加一行关联<英雄>的<英雄序列器>代码:

     1 heroinfo_set = HeroInfoSerializer(label="本书的英雄", many=True) 

   然后运行测试代码:

1 if __name__ == __main__:
2     books = BookInfo.objects.all()
3     # 联序列化 使用序列化器关联 书>英雄
4     serializer = BookInfoSerializer(books, many=True)
5     #格式化输出
6     format_data = json.dumps(serializer.data, indent=1, ensure_ascii=False)
7     print(format_data)

  得到输出结果:[得到子集的内容,表示该书的英雄内容(用英雄序列器包含的“字段”进行序列输出)]

技术分享图片

 

 


 

 

分享到此结束,此外需要注意几点:

  1. 创建关联,使用序列器进行关联的时候,即符合上述第III点的情况,注意调整序列器的位置,因为需要使用的序列器,需要在类前面有所定义;
  2. 同样是对于使用序列器进行关联, 注意禁止使用多个类都使用对方的序列器进行关联,如此会出现报错(循环嵌套调用,死循环,不合理),遵守一个类使用,另一个关联类不使用。
  3. 注意获取对象有多个的时候,需要添加
    many=True
    

      

 

关于--学习DRF序列器--关联序列化

原文:https://www.cnblogs.com/harp-yestar/p/serializer_connect.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!