模型类:

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)

 

Logo

一站式虚拟内容创作平台,激发创意,赋能创作,进入R空间,遇见同道,让优质作品闪耀发光。​

更多推荐