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

由于笔者在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
    

      

猜你喜欢

转载自www.cnblogs.com/harp-yestar/p/serializer_connect.html