美文网首页FastAPI从上线到下架
computed自定义添加Pydantic序列化字段

computed自定义添加Pydantic序列化字段

作者: 楠木cral | 来源:发表于2022-08-11 09:12 被阅读0次

使用tortoise-orm,通过Pydantic序列化查询集,除了模型自带的字段,用户如果想自己自定义一些跟模型字段有管的字段,就可以通过computed来添加到Pydantc。
下面通过用户-徽章和用户徽章中间表关系来举例

class Badge(models.Model):
    """徽章表"""
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=32, verbose_name="徽章名")
    score = fields.FloatField(default=100, help_text="获得徽章时增加的积分", verbose_name='增加积分')
    buff = fields.FloatField(default=1.5, help_text="徽章效果, 即获得积分增益倍数", verbose_name='增益倍数')
    image = fields.TextField(default="", blank=True, verbose_name='图片')
    image_gray = fields.TextField(default="", blank=True, verbose_name="灰色图")
    image_light = fields.TextField(default="", blank=True, verbose_name='光效图')

class UserBadge(models.Model):
    """用户徽章表"""
    id = fields.IntField(pk=True)
    user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField("cp_model.User", on_delete=fields.CASCADE,
                                                                   related_name="user_badges")
    badge: fields.ForeignKeyRelation[Badge] = fields.ForeignKeyField("cp_model.Badge",
                                                                     on_delete=fields.CASCADE)
    expired = fields.DatetimeField(default=default_expired_time, help_text="徽章buff的过期时间", blank=True)

    class Meta:
        unique_together = (("user", "badge"),)  # 进行手动判断
        ordering = ("expired",)
        table = "cp_user_badge"

class User(models.Model):
    """用户表"""
    id = fields.IntField(pk=True)
    wx_uid = fields.CharField(max_length=32)
    open_id = fields.CharField(max_length=32, default="", null=True, blank=True)
    name = fields.CharField(max_length=32, index=True)

    def valid_badges(self) -> list:
        # return []
        if not self.user_badges.related_objects:
            return []
        return [_ for _ in self.user_badges if _.expired >= timezone.now()]

    class PydanticMeta:
        computed = ["valid_badges"]

想要获取用户信息以及用户的徽章列表信息,徽章获取时想要筛选没过期的徽章列表。
如下:在model里User表中通过关联关系名user_badges来获取关系,需要在Pydantic中声明user_badges,需要添加一个valid_badges字段,就需要再model里面函数形式声明字段名,并使用computed 字段來指明。

class OnlyOneUserSchema(
    pydantic_model_creator(
        User, name="OnlyOneUserSchema",
        exclude=())
):
    """用户详情"""
    user_badges: List[UserBadgeSimpleSchema] = None
    valid_badges: List[UserBadgeSimpleSchema] = None

tip:要想从关联关系表进行条件筛选,可以通过Prefetch来实现

相关文章

  • computed自定义添加Pydantic序列化字段

    使用tortoise-orm,通过Pydantic序列化查询集,除了模型自带的字段,用户如果想自己自定义一些跟模型...

  • 如何序列化被transient关键字修饰的字段

    被static和transient关键字修饰过的字段是不会被序列化和反序列化的 方式1:自定义序列化字段 Java...

  • HAP自定义Excel导出

    添加自定义导出按钮 扩展 viewModel 对象并添加 exportExcelCustom() 方法 给字段添加...

  • Gson使用

    添加依赖 1、数组序列化与反序列化 输出结果为: 2、关键字序列化,如果序列化的字段中含有class、public...

  • 6. 序列化

    序列化用于对用户请求数据进行验证和数据进行序列化。 a. 自定义字段 urls.py views.py b. 基于...

  • Enum定义最佳实践

    Enum 在 jackson 序列化和反序列化时默认使用枚举的name(), 而一般存储的数据可能是自定义字段。可...

  • 序列化

    序列化用于对用户请求数据进行验证和数据进行序列化。a. 自定义字段urls.py views.py b. 基于Mo...

  • 枚举类型的json序列化

    自定义枚举 枚举类型的序列化: 枚举数组的序列化: 使用的时候在get方法上添加上@JsonSerialize(u...

  • 操作Json技巧

    忽略某个字段 添加额外的字段 合并两个结构体 将字符串解析到两个结构体中 重命名字段 将字段序列化为字符串

  • Gson的使用-4

    简单自定义序列化 简单自定义反序列化 jsonAdapter()注解; 自定义序列化和反序列化的过程

网友评论

    本文标题:computed自定义添加Pydantic序列化字段

    本文链接:https://www.haomeiwen.com/subject/adlawrtx.html