当我尝试使用FastAPI获取嵌套的pydantic嵌套数据时出现错误

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

我在尝试从 3 个模型检索信息时遇到一些问题。

class User(Base):
__tablename__ = 'users'
id = Column(UUID(as_uuid=True), primary_key=True, nullable=False,
            default=uuid.uuid4)
username = Column(String, nullable=False)
email = Column(String, unique=True, nullable=False)
phone = Column(String, unique=True, nullable=False)
password = Column(String, nullable=False)
photo = Column(String, nullable=True)
company_id = Column(UUID(as_uuid=True), ForeignKey(
    'companies.id', ondelete='CASCADE'), nullable=True)
verified = Column(Boolean, nullable=False, server_default='False')
verification_code = Column(String, nullable=True, unique=True)
# role = Column(String, nullable=True, unique=False)
role = Column(UUID(as_uuid=True), ForeignKey(
    'permissions.id', ondelete='CASCADE'), nullable=True)
created_at = Column(TIMESTAMP(timezone=True),
                    nullable=False, server_default=text("now()"))
updated_at = Column(TIMESTAMP(timezone=True),
                    nullable=False, server_default=text("now()"))

class Company(Base):
    __tablename__ = 'companies'
    id = Column(UUID(as_uuid=True), primary_key=True, nullable=False,
                default=uuid.uuid4)
    company_name = Column(String, nullable=False)
    inn = Column(String, nullable=True)
    email = Column(String, nullable=False)
    phone = Column(String(255), nullable=False)
    type = Column(String(12), nullable=False)
    created_at = Column(TIMESTAMP(timezone=True),
                        nullable=False, server_default=text("now()"))
    updated_at = Column(TIMESTAMP(timezone=True),
                        nullable=False, server_default=text("now()"))
    users = relationship('User')


class UserPermissions(Base):
    __tablename__ = 'permissions'
    id = Column(UUID(as_uuid=True), primary_key=True, nullable=False,
                default=uuid.uuid4)
    order_read = Column(Boolean, nullable=False, server_default='False')
    item_write = Column(Boolean, nullable=False, server_default='False')
    is_admin = Column(Boolean, nullable=False, server_default='False')
    permission_name = Column(String, nullable=False)

    created_at = Column(TIMESTAMP(timezone=True),
                        nullable=False, server_default=text("now()"))
    updated_at = Column(TIMESTAMP(timezone=True),
                        nullable=False, server_default=text("now()"))
    users = relationship('User')

这是我的模式

class CompanyBaseSchema(BaseModel):
    company_name: str
    email: EmailStr
    phone: str
    inn: str | None = None
    type: str

    class Config:
        orm_mode = True
    
class CompanyInfoResponse(BaseModel):
        status: str
        users_amount: int
        company: CompanyUsersResponse

class CompanyUsersResponse(CompanyBaseSchema):
    id: uuid.UUID
    created_at: datetime
    inn: str | None = None
    users: List[FilteredUserResponse]
    updated_at: datetime

class PermissionBaseSchema(BaseModel):
    # id: uuid.UUID | None = None
    order_read: bool
    item_write: bool
    is_admin: bool
    permission_name: str
    created_at: datetime
    updated_at: datetime

    class Config:
        orm_mode = True

class FilteredPermissionSchema(PermissionBaseSchema):
    id: uuid.UUID | None = None

class UserBaseSchema(BaseModel):
    username: str
    email: EmailStr
    phone: str
    company_id: uuid.UUID | None = None
    role: uuid.UUID

    class Config:
        orm_mode = True

class FilteredUserResponse(UserBaseSchema):
    username: str | None = None
    email: EmailStr | None = None
    phone: str | None = None
    role: FilteredPermissionSchema

我的路线看起来像

@router.get('/info', response_model=schemas.CompanyInfoResponse)
def get_company_info(db: Session = Depends(get_db),
                     user_id: str = Depends(require_user)):
    # user_company = db.query(models.User).filter(models.User.id == user_id)
    user_company_one = db.query(models.User).filter(models.User.id == user_id).first().company_id
    company_info = get_post(str(user_company_one), db, user_id)
    return {'status': 'success', 'users_amount': len(company_info.users), 'company': company_info}

当我尝试根据方案获取数据时

CompanyInfoResponse
我收到这样的消息

    pydantic.error_wrappers.ValidationError: 18 validation errors for CompanyInfoResponse
response -> company -> users -> 0 -> role -> order_read
  field required (type=value_error.missing)
response -> company -> users -> 0 -> role -> item_write
  field required (type=value_error.missing)
response -> company -> users -> 0 -> role -> is_admin
  field required (type=value_error.missing)
response -> company -> users -> 0 -> role -> permission_name
  field required (type=value_error.missing)
response -> company -> users -> 0 -> role -> created_at
  field required (type=value_error.missing)
response -> company -> users -> 0 -> role -> updated_at
  field required (type=value_error.missing)
response -> company -> users -> 1 -> role -> order_read
  field required (type=value_error.missing)
response -> company -> users -> 1 -> role -> item_write
  field required (type=value_error.missing)
response -> company -> users -> 1 -> role -> is_admin
  field required (type=value_error.missing)
response -> company -> users -> 1 -> role -> permission_name
  field required (type=value_error.missing)
response -> company -> users -> 1 -> role -> created_at
  field required (type=value_error.missing)
response -> company -> users -> 1 -> role -> updated_at
  field required (type=value_error.missing)
response -> company -> users -> 2 -> role -> order_read
  field required (type=value_error.missing)
response -> company -> users -> 2 -> role -> item_write
  field required (type=value_error.missing)
response -> company -> users -> 2 -> role -> is_admin
  field required (type=value_error.missing)
response -> company -> users -> 2 -> role -> permission_name
  field required (type=value_error.missing)
response -> company -> users -> 2 -> role -> created_at
  field required (type=value_error.missing)
response -> company -> users -> 2 -> role -> updated_at
  field required (type=value_error.missing)

这是一个非常奇怪的员工,因为。如果没有

UserPermissions
模型方案,它可以正常工作,并且如果我愿意,可以向我显示权限的 uuid。只是不解析它。如果我想解析
UserPermissions

,你能解释一下为什么会显示该错误吗?
python sqlalchemy fastapi pydantic
1个回答
0
投票

好吧,我解决了这个问题...... 我只是使用了

role
方案的
Permission
标签。但必须使用
permissions

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