【问题标题】:pydantic.error_wrappers.ValidationError: 11 validation errors for For Trip type=value_error.missingpydantic.error_wrappers.ValidationError: For Trip type=value_error.missing 的 11 个验证错误
【发布时间】:2022-08-07 01:05:44
【问题描述】:

我的 pydantic 模式出现此错误,但奇怪的是它正确生成了对象,并将其发送到 SQLAlchemy 模型,然后它突然为模型中的所有元素抛出错误。

response -> id
  field required (type=value_error.missing)
response -> date
  field required (type=value_error.missing)
response -> time
  field required (type=value_error.missing)
response -> price
  field required (type=value_error.missing)
response -> distance
  field required (type=value_error.missing)
response -> origin_id
  field required (type=value_error.missing)
response -> destination_id
  field required (type=value_error.missing)
response -> driver_id
  field required (type=value_error.missing)
response -> passenger_id
  field required (type=value_error.missing)
response -> vehicle_id
  field required (type=value_error.missing)
response -> status
  field required (type=value_error.missing)

我必须说所有字段都应该有值。而且错误跟踪不引用我的代码的任何部分,所以我什至不知道在哪里调试。我是 SQLAlchemy/pydantic 的菜鸟

这是代码的一些部分

class Trip(BaseModel):
    id: int
    date: str
    time: str
    price: float
    distance: float
    origin_id: int
    destination_id: int
    driver_id: int
    passenger_id: int
    vehicle_id: int
    status: Status

    class Config:
        orm_mode = True
class TripDB(Base):
    __tablename__ = \'trip\'
    __table_args__ = {\'extend_existing\': True}
    id = Column(Integer, primary_key=True, index=True)
    date = Column(DateTime, nullable=False)
    time = Column(String(64), nullable=False)
    price = Column(Float, nullable=False)
    distance = Column(Float, nullable=False)
    status = Column(String(64), nullable=False)

    origin_id = Column(
        Integer, ForeignKey(\'places.id\'), nullable=False)
    destination_id = Column(
        Integer, ForeignKey(\'places.id\'), nullable=False)

    origin = relationship(\"PlaceDB\", foreign_keys=[origin_id])
    destination = relationship(\"PlaceDB\", foreign_keys=[destination_id])

    driver_id = Column(
        Integer, ForeignKey(\'driver.id\'), nullable=False)
    vehicle_id = Column(
        Integer, ForeignKey(\'vehicle.id\'), nullable=False)
    passenger_id = Column(
        Integer, ForeignKey(\'passenger.id\'), nullable=False)
def create_trip(trip: Trip, db: Session):
    origin = db.query(models.PlaceDB).filter(models.PlaceDB.id == trip.origin_id).first()
    destination = db.query(models.PlaceDB).filter(models.PlaceDB.id == trip.destination_id).first()
    db_trip = TripDB(
        id=(trip.id or None),
        date=trip.date or None, time=trip.time or None, price=trip.price or None, 

    distance=trip.distance or None, 
            origin_id=trip.origin_id or None, destination_id=(trip.destination_id or None), status=trip.status or None, 
            driver_id=trip.driver_id or None, passenger_id=trip.passenger_id or None, vehicle_id=trip.vehicle_id or None, origin=origin, destination=destination)
    try:
        db.add(db_trip)
        db.commit()
        db.refresh(db_trip)
        return db_trip

    except:
        return \"Somethig went wrong\"

  • 你检查过你的数据库的回报吗?你确定你没有传入create_trip函数的最后一个except吗?
  • 返回是好的,我已经设法“修复”它,从创建行程函数中删除了 pydantic 模型,我知道它可能是错误的,但它可以工作,通过一些手动类型检查它应该运行没有任何问题...有趣的是显然它从未进入 create_trip 函数...

标签: python sqlalchemy pydantic


【解决方案1】:

这似乎是 pydantic 模型上的一个错误,它也发生在我身上,我无法修复它,但实际上,如果你只是跳过路线中的类型检查,它就可以正常工作

【讨论】:

    【解决方案2】:

    您的架构和 create_trip 函数似乎存在冲突。您是否检查过是否将正确的参数传递给您的架构?您已将大多数字段定义为不可为空,并且在 db.add() 命令中将 None 作为替代值传递。

    我的代码也有类似的问题,我认为 schema 和 server.py 之间的命名和类型约定。在两个文件中匹配字段名称和类型后,我解决了所需字段的错误(type=value_error.missing)。

    # project/schema.py
    from pydantic import BaseModel
    
    # here I had made mistake by using target_URL in server.py
    # variable name and type should be same in both schema and server
    class URLBase(BaseModel):
        target_url: str
    
    
    class URL(URLBase):
        is_active: bool
        clicks: int
    
        class Config:
            orm_mode = True
    
    
    class URLInfo(URL):
        url: str
        admin_url: str
    
    # project/server.py
    @app.post('/url', response_model=schema.URLInfo)
    def create_short_url(url: schema.URLBase, db: Session = Depends(get_db)):
        if not validators.url(url.target_url):
            raise bad_request_message(message="Your provided URL is not valid!")
        chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        key = "".join(secrets.choice(chars) for _ in range(5))
        secret_key = "".join(secrets.choice(chars) for _ in range(8))
        db_url = models.URL(target_url=url.target_url, key=key, secret_key=secret_key)
        db.add(db_url)
        db.commit()
        db.refresh(db_url)
        db_url.url = key
        db_url.admin_url = secret_key
    
        return db_url
    

    【讨论】:

      猜你喜欢
      • 2021-06-28
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多