为什么我的代码返回这个:输入应该是有效的列表。如果我要设置验证?

问题描述 投票:0回答:1

main.py:

from typing import List
import json

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from config import collection
from model import Usuario

app = FastAPI()

app.add_middleware( #parametros pra liberar a conexao
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
async def read_users() -> List[Usuario]:
    itens = [Usuario(**usuario) for usuario in collection.find()]
    print(itens)
    return itens

配置.py:

from pymongo import MongoClient

client = MongoClient("mongodb://allanvargensDB:vargens@localhost:27017/")

db = client['portfolio']
collection = db['usuario']

模型.py:

from typing import List

from bson import ObjectId
from pydantic import BaseModel,  Field, BaseConfig


class OID(str):
    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v):
        try:
            return ObjectId(str(v))
        except Exception:
            raise ValueError("not a valid ObjectId")


class MyBaseModel(BaseModel):
    def __hash__(self):
        return hash((type(self),) + tuple(self.__dict__.values()))


class Projects(MyBaseModel):
    id_project: ObjectId = Field(description='project id', alias='project_id')
    title: str
    imagePath: str
    url: str = ''

    class Config(BaseConfig):
        arbitrary_types_allowed = True
        json_encoders = {
            ObjectId: lambda oid: str(oid)
        }


class Usuario(BaseModel):
    id_user: ObjectId = Field(description='user id', alias='user_id')
    name: str
    login: str
    password: str
    projects: List[Projects] = Field(alias='projects')

    class Config(BaseConfig):
        arbitrary_types_allowed = True
        json_encoders = {
            ObjectId: lambda oid: str(oid)
        }

消息错误:

pydantic_core._pydantic_core.ValidationError: 1 validation error for Usuario projects
   Input should be a valid list [type=list_type, input_value={'project_id': ObjectId('..., 'url': 'teste.com.br'}, input_type=dict]
     For further information visit https://errors.pydantic.dev/2.5/v/list_type

我是Python新手。有没有更好的方法来创建一个返回我的 mongo db 的所有用户的路由器?

我的数据库信息:

{
    _id: ObjectId('656e6c2fc0feaabbfb87d63e'),
    name: 'Allan Vargens',
    login: 'allanvargens',
    password: 'password',
    projects: {
        project_id: ObjectId('656e6d7ec0feaabbfb87d640'),
        titulo: 'teste',
        imageUrl: '',
        url: 'teste.com.br'
    },
    user_id: ObjectId('656e6c2fc0feaabbfb87d63e')
}
python mongodb pymongo fastapi pydantic
1个回答
0
投票

由于您的

Usuario.projects
Projects
的列表,因此您应该将其括在方括号中:

{
    _id: ObjectId('656e6c2fc0feaabbfb87d63e'),
    name: 'Allan Vargens',
    login: 'allanvargens',
    password: 'password',
    projects: [
        {
            project_id: ObjectId('656e6d7ec0feaabbfb87d640'),
            titulo: 'teste',
            imageUrl: '',
            url: 'teste.com.br'
        },
    ],
    user_id: ObjectId('656e6c2fc0feaabbfb87d63e')
}

© www.soinside.com 2019 - 2024. All rights reserved.