创建具有ID的对象并填充其他字段

时间:2020-03-15 17:34:42

标签: python fastapi pydantic

我只想用ID构造Pydantic对象,然后根据ID填充其他字段。
我尝试了2种不同的方法,验证器和初始化后的方法。两者都没有,所以。

公用代码:

from pydantic import BaseModel, validator

obj_list = [
    {'id': 1, 'name': 'a', 'desc': 'desc1'},
    {'id': 2, 'name': 'b', 'desc': 'desc2'},
    {'id': 3, 'name': 'c', 'desc': 'desc3'}
]

解决方案1:

class Obj(BaseModel):
    id: int
    name: str = None
    desc: str = None

    @validator('id')
    def validate_exists(cls, v):
        items = [h for h in obj_list if h['id'] == v]
        if len(items) == 0:
            raise ValueError('id doesnt exist')
        return v

    def __post_init__(self):
        item = [h for h in obj_list if h['name'] == v][0]
        self.name = item['name']
        self.desc = item['desc']

Obj(id=1)
# <Obj id=1 name=None desc=None>

解决方案2:

class Obj(BaseModel):
    name: str = None
    desc: str = None
    id: int

    @validator('id')
    def validate_exists(cls, v, values):
        items = [h for h in obj_list if h['id'] == v]
        if len(items) == 0:
            raise ValueError('id doesnt exist')
        item = items[0]
        values['name'] = item['name']
        values['desc'] = item['desc']
        return v

Obj(id=1)
# <Obj name=None desc=None id=1>

我觉得这是可行的。我阅读了Pydantic和FastApi的文档,但找不到与此相关的任何内容。 那么,如何仅使用ID构造对象,然后使用DB或其他对象填充字段?

2 个答案:

答案 0 :(得分:1)

我在{旦语中使用const jwt = require('jsonwebtoken'); // Verify user token from cookie const verifyToken = async (req, res, next) => { // Get token from cookie named token const token = req.cookies.token || ''; try { // Check if cookie exists, maybe expired maybe user didnt have one - no login if (!token) { return next(); } // Decrypt users jwt token and get information const decrypt = await jwt.verify(token, process.env.JWT_KEY); // Pass that infomation to request user object req.user = { id: decrypt.id, auth_level: decrypt.auth_level, test: 'test' }; // Continue with exectution of app return next(); } catch (err) { return res.status(500).json(err.toString()); } }; module.exports = verifyToken; 解决了这个问题。

root_validator

答案 1 :(得分:0)

__post_init__不存在,我认为您将其与数据类混淆了。

当创建模型对象时,金字塔式事物验证应该发生一次。尽管您可以使用Config.validate_assignment来解决此问题。

对此有两种解决方案:

  1. 仅使用id创建每个模型,然后使用属性分配来设置其他字段。这会比较慢,我认为这是错误的方法。
  2. 在拥有创建模型所需的所有数据之前,不要创建模型。我建议这是最好的方法。