drf序列化输出新增字段
模型类:class Role(models.Model):"""角色表,一的一方"""name = models.CharField(max_length=30, unique=True, verbose_name='角色名称')# 媒体运营,广告运营,活动运营,财务,技术,唯一,必填desc = models.CharField(max
·
模型类:
class Role(models.Model):
"""角色表,一的一方"""
name = models.CharField(max_length=30, unique=True, verbose_name='角色名称') # 媒体运营,广告运营,活动运营,财务,技术,唯一,必填
desc = models.CharField(max_length=100, null=True, blank=True, verbose_name='角色描述') # 非必填
class Meta:
db_table = 'tb_role'
verbose_name = '角色'
verbose_name_plural = verbose_name
def __str__(self):
"""控制对象输出内容"""
return self.name
class User(BaseModel):
"""用户表,多的一方"""
account = models.CharField(max_length=30, unique=True, verbose_name='登录账户') # 必填,唯一
password = models.CharField(max_length=100, null=True, blank=True, default='888888',
verbose_name='登录密码') # 非必填,默认888888,长度100是为了以后加密扩展
username = models.CharField(max_length=30, null=True, blank=True, verbose_name='用户名称') # 非必填
role = models.ForeignKey(Role, on_delete=models.CASCADE, related_name='user', verbose_name='角色')
class Meta:
db_table = 'tb_user'
verbose_name = '用户'
verbose_name_plural = verbose_name
def __str__(self):
"""控制对象输出内容"""
return self.account
drf模型序列化器默认仅返回数据库中已存在字段,如果想新增输出字段,改如何操作?
例如:输出用户角色时,顺便输出当前角色总共有多少用户.
class RoleModelSerializer(serializers.ModelSerializer):
"""角色模型序列化器"""
user_count = serializers.SerializerMethodField(label='用户数量') # 新增数据库不存在字段用户数量
class Meta:
model = Role
fields = ['id', 'name', 'desc', 'user_count']
def get_user_count(self, obj):
"""
返回当前角色用户数量
固定写法,obj代表Role实例对象,模型类配置了反向引用user代表当前角色用户
"""
number = obj.user.count()
return number
可以点进去查看官方源码对SerializerMethodField类的声明:
class SerializerMethodField(Field):
"""
A read-only field that get its representation from calling a method on the
parent serializer class. The method called will be of the form
"get_{field_name}", and should take a single argument, which is the
object being serialized.
For example:
class ExampleSerializer(self):
extra_info = SerializerMethodField()
def get_extra_info(self, obj):
return ... # Calculate some data to return.
"""
def __init__(self, method_name=None, **kwargs):
self.method_name = method_name
kwargs['source'] = '*'
kwargs['read_only'] = True
super(SerializerMethodField, self).__init__(**kwargs)
更多推荐

所有评论(0)