【发布时间】:2023-03-11 13:56:01
【问题描述】:
由于某种原因,在此示例中,可选 is_active 属性未设置为默认值。
from pydantic import BaseModel, EmailStr
from datetime import datetime
# Pydantic schemas
# Shared properties
class UserBase(BaseModel):
email: Optional[EmailStr] = None
is_active: Optional[bool] = True
is_superuser: bool = False
username: Optional[str] = None
# Properties to receive via API on creation
class UserCreate(UserBase):
email: EmailStr
password: str
# sqlalchemy model
class User(Base):
id = Column(Integer, primary_key=True, index=True)
username = Column(String(25), index=True, unique=True, nullable=False)
email = Column(String(50), unique=True, index=True, nullable=False)
hashed_password = Column(String(256), nullable=False)
is_active = Column(Boolean(), default=True, nullable=False)
is_superuser = Column(Boolean(), default=False, nullable=False)
__mapper_args__ = {"eager_defaults": True}
我期望is_active 的默认值是可选输入,是True。但如果没有明确通过,我会得到None。
obj_in = UserCreate(email=email, password=password, username=username)
print(obj_in.is_active)
# True
db_obj = User(
email=obj_in.email,
hashed_password=get_password_hash(obj_in.password),
username=obj_in.username,
is_superuser=obj_in.is_superuser,
# is_active=obj_in.is_active,
)
print(db_obj.is_active)
# None
# I have to add the is_active flag explicitly
db_obj = User(
email=obj_in.email,
hashed_password=get_password_hash(obj_in.password),
username=obj_in.username,
is_superuser=obj_in.is_superuser,
is_active=obj_in.is_active,
)
print(db_obj.is_active)
# True
【问题讨论】:
-
不确定是否是问题所在;但是,我认为您不应该致电
Boolean。请改用,例如:is_active = Column(Boolean, default=True, nullable=False)即末尾没有括号/括号。 -
谢谢,但这似乎无关紧要。以
String(25)为例。 -
刚刚以您编写的方式在 SQLite 上进行了测试,您是对的:似乎无关紧要。它是什么关系型数据库?也许有一些不兼容的东西?
-
我正在使用 postgres,但应该没关系吧?因为这个问题甚至在插入数据库之前就出现了
-
嗯,是的,那很可能不是问题,因为它是一个主要的数据库。我刚刚在 SQLAlchemy 文档中读到,如果数据库没有布尔类型,可能会有问题。但是,例如,SQLite 存储一个 1 就可以了。
标签: python postgresql asynchronous sqlalchemy pydantic