我只想用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或其他对象填充字段?
答案 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
来解决此问题。
对此有两种解决方案:
id
创建每个模型,然后使用属性分配来设置其他字段。这会比较慢,我认为这是错误的方法。