Django系列之Serializer的source参数使用、自定义序列化方法

news/2024/11/20 11:48:13/

数据准备

models.py

from django.contrib.auth.models import AbstractUser
from django.db import modelsclass Publish(models.Model):name = models.CharField(max_length=32)city = models.CharField(max_length=8)email = models.CharField(max_length=32)def __str__(self):return self.nameclass AuthorDetail(models.Model):birthday = models.DateField()telephone = models.BigIntegerField()addr = models.CharField(max_length=64)class Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()gender = models.IntegerField(choices=(('1', '男'), ('0', '女')))ad = models.OneToOneField(AuthorDetail, on_delete=models.CASCADE, null=True)def __str__(self):return self.nameclass Book(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=5, decimal_places=2)pub_date = models.DateField()publish = models.ForeignKey(Publish, on_delete=models.CASCADE, null=True)authors = models.ManyToManyField(Author, db_table="book2author")def __str__(self):return self.title

serializers字段的source参数

使用默认的序列化器时,视图函数访问 具有choices参数 的字段或 一对一一对多多对多 字段时,返回的数据只有 id 值,就像下面这种方式,性别是0或1,居住地址是居住详情表中的id值:

[{"id": 1,"name": "阿明","age": 16,"gender": 1,"ad": 1},{"id": 3,"name": "阿美","age": 21,"gender": 0,"ad": 3}
]

对上面这些场景使用source参数:

  1. get_xxx_display 用于显示 choices 参数对应的文本信息。
    serializers.py

    class AuthorSerializer(serializers.ModelSerializer):
    gender_txt = serializers.CharField(source='get_gender_display')		# 使用get_xxx_displayclass Meta:model = Authorfields = "__all__"
    

    返回的结果:

    [{"id": 1,"gender_txt": "男","name": "阿明","age": 16,"gender": "1","ad": 1},{"id": 2,"gender_txt": "男","name": "阿伟","age": 25,"gender": "1","ad": 2},{"id": 3,"gender_txt": "男","name": "阿华","age": 21,"gender": "1","ad": 3},{"id": 4,"gender_txt": "女","name": "阿美","age": 16,"gender": "0","ad": 4}
    ]
    

    注意:为什么添加了 source=get_xxx_display 还是没有显示出对应文本信息?把 choices=(('1', '男'), ('0', '女')) 的 0 和 1 改成字符串形式再试试。

    当然,也可以在视图函数中,使用 obj.get_xxx.display() 来获取choices文本值。

    >>> Author.objects.get(id=1).gender
    '1'
    >>> Author.objects.get(id=1).get_gender_display()
    '男'
    >>>
    
  2. 显示 一对一一对多多对多 字段对应的文本信息。
    serializers.py

    class AuthorSerializer(serializers.ModelSerializer):gender_txt = serializers.CharField(source='get_gender_display')address_txt = serializers.CharField(source='ad.addr')	# 支持连表查询class Meta:model = Authorfields = "__all__"
    

    返回的结果:

    [{"id": 1,"gender_txt": "男","address_txt": "beijing","name": "阿明","age": 16,"gender": "1","ad": 1},{"id": 2,"gender_txt": "男","address_txt": "shanghai","name": "阿伟","age": 25,"gender": "1","ad": 2},{"id": 3,"gender_txt": "男","address_txt": "shanghai","name": "阿华","age": 21,"gender": "1","ad": 3},{"id": 4,"gender_txt": "女","address_txt": "guangzhou","name": "阿美","age": 16,"gender": "0","ad": 4}
    ]
    
  3. 自定义序列化输出方法

    class AuthorSerializer(serializers.ModelSerializer):gender_txt = serializers.CharField(source='get_gender_display')address_zidingyi = serializers.SerializerMethodField()		# 自定义序列化方法, 会寻找并执行'get_xxx'的方法。def get_address_zidingyi(self, obj):return obj.ad.addrclass Meta:model = Authorfields = "__all__"
    

    返回的结果:

    [{"id": 1,"gender_txt": "男","address_zidingyi": "beijing","name": "阿明","age": 16,"gender": "1","ad": 1},{"id": 2,"gender_txt": "男","address_zidingyi": "shanghai","name": "阿伟","age": 25,"gender": "1","ad": 2},{"id": 3,"gender_txt": "男","address_zidingyi": "shanghai","name": "阿华","age": 21,"gender": "1","ad": 3},{"id": 4,"gender_txt": "女","address_zidingyi": "guangzhou","name": "阿美","age": 16,"gender": "0","ad": 4}
    ]
    

http://www.ppmy.cn/news/1198037.html

相关文章

13、插件同时注入到Context、Vue实例

配置插件 plugins\all-inject.js /*** inject 同时将方法注入到context和vue实例和store中*/ export default (context, inject) > {// 第一个参数是注入的名称inject(myAllFunction, string > console.log(string)) }nuxt.config.js export default {...// Plugins t…

多级缓存之JVM进程缓存

1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时&#xff0…

R语言中的函数27:polynom::polynomial(), deriv(),integral(),solve()多式处理函数

文章目录 介绍polynomial()用法参数实例多项式的加减乘除等运算实例 deriv()和integral()用法参数实例solve()参数实例 介绍 R语言中的polynom包可以实现对多项式的操作,例如:加、减、乘、除、微分、积分。使用的时候先用polynomial()函数定义一个多项式…

MySQL数据库干货_20——MySQL中的索引【附有详细代码】

MySQL中的索引 索引介绍 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。索引是一种特殊的文件,它们包含着对数据表里所有记录的位置信息。更通俗的说,数据库索引好比是一本书前面的目录&…

SSTI模板注入入门

一.关系:子类->父类 class A:passclass B(A):passclass C(B):passclass D(B):passcC() 1.__class__查看当前类 c:当前类 print(c.__class__) 2.__base__查看当前类的父类 print(c.__class__.__base__) c的父类的父类 print(c.__class__.__base_…

FaceChain开源虚拟试衣功能,打造更便捷高效的试衣新体验

简介 虚拟试衣这个话题由来已久,电商行业兴起后,就有相关的研发讨论。由其所见即所得的属性,它可以进一步提升用户服装购买体验。它既可以为商家做商品展示服务,也可以为买家做上身体验服务,这让同时具备了 B 和 C 的两…

Web3游戏的十字路口:沿用传统IP还是另起炉灶?

人们经常问我对 Web3 游戏有什么看法。因此,我想以书面形式概述一下我目前的想法。 让我先澄清一下:我不是专家。这不是一篇深入探讨游戏世界精细指标如 MAU 或 D14 等的全面分析。请把这看作是我根据个人交流和研究,这反映我在游戏领域关注…

Technology strategy Pattern 学习笔记3-Creating the Strategy-Industry context

Creating the Strategy-Industry context 1 SWOT 1.1 create steps 1.与内部各方沟通 了解企业的人、流程和技术,包括与其它企业的不同了解哪些创新可以做竞争者及市场信息企业可以支撑的类似业务 按SWOT四象限分类,先做列表后放入象限 1.2 四象限…