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()
关联序列化输出有三种形式, 关联序列换输出:
== 前提准备好<书>和<英雄>的模型类 ==
准备图书类序列器
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)
得到输出结果:[得到子集的内容,表示该书的英雄内容(用英雄序列器包含的“字段”进行序列输出)]
分享到此结束,此外需要注意几点:
many=True
原文:https://www.cnblogs.com/harp-yestar/p/serializer_connect.html