я пытаюсь запустить запрос на размещение, но я продолжаю получать объект типа ошибки «Пользователь» не имеет атрибута «first_name», когда я объявил first_name в схеме. это мой код для запроса API, который вызывает функцию update_user из сервисов.
main.py:
@app.put("/api/userUpdate/{id}", status_code=200)
async def update_User(
id = int,
user = _schemas.User,
db: _orm.Session = _fastapi.Depends(_services.get_db),
):
await _services.update_user(id, user, db)
return {"message", "Successfully Updated"}
services.py:
async def get_user_by_id(id: int, db: _orm.Session):
return db.query(_models.User).filter(_models.User.id == id).first()
async def update_user(id: int, user: _schemas.User, db: _orm.Session):
user_db = await get_user_by_id(id, db)
user_db.first_name = user.first_name
user_db.last_name = user.last_name
user_db.email = user.email
db.commit()
db.refresh(user_db)
return _schemas.User.from_orm(user_db)
схемы.py
class _UserBase(_pydantic.BaseModel):
email: str
class UserCreate(_UserBase):
hashed_password: str
first_name: str
last_name: str
user_role : str
class Config:
orm_mode = True
class User(_UserBase):
id: int
first_name: str
last_name: str
user_role : str
class Config:
orm_mode = True
модели.py
class User(_database.Base):
__tablename__ = "users"
id = _sql.Column(_sql.Integer, primary_key=True, index=True)
email = _sql.Column(_sql.String, unique=True, index=True)
hashed_password = _sql.Column(_sql.String)
first_name = _sql.Column(_sql.String, index=True)
last_name = _sql.Column(_sql.String, index=True)
user_role = _sql.Column(_sql.String, index = True)
leads = _orm.relationship("Lead", back_populates = "owner")
def verify_password(self, password: str):
return _hash.bcrypt.verify(password, self.hashed_password)
запрос из интерфейса:
const handleUpdateUser = async (e) => {
e.preventDefault();
const requestOptions = {
method: "PUT",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + token,
},
body: JSON.stringify({
first_name: userName,
last_name: userSurname,
email: userEmail,
}),
};
const response = await fetch(`/api/userUpdate/${id}`, requestOptions);
if (!response.ok) {
setErrorMessage("Something went wrong when updating lead");
} else {
cleanFormData();
handleModal();
}
};
при запуске запроса получаю ошибку
AttributeError: type object 'User' has no attribute 'first_name'
Да, я хотел использовать идентификатор для поиска объекта пользователя, а затем обновить конкретные пользовательские данные.
Что не так указано в сообщении об ошибке. Если вы внимательно прочитаете его, там написано «AttributeError: объект типа «Пользователь» не имеет атрибута «first_name»». Это означает, что где-то вы присваиваете переменную типу User вместо экземпляра класса User.
И я считаю, что место, где это произошло, находится в основном файле, где у вас был user = _schemas.User
. Это устанавливает значение по умолчанию для user
как тип _schemas.User
. Я полагаю, вы пытаетесь ввести намек на то, что user
будет типа _shcmas.User
. Если это так, вы должны использовать двоеточие вместо равенства, например: user: _schemas.User
. Вы также ставите id = int
вместо id: int
. Все должно работать после того, как вы исправите эти ошибки с подсказками двух типов.
@app.put("/api/userUpdate/{id}", status_code=200)
async def update_User(
id: int,
user: _schemas.User,
db: _orm.Session = _fastapi.Depends(_services.get_db),
):
await _services.update_user(id, user, db)
return {"message", "Successfully Updated"}
{id}
является компонентом URL-адреса, поэтому я вижу, что это аргумент этой функции. Но откуда должно взяться user
?
Пользователь @JohnGordon придет из тела запроса. Не обязательно указывать это в FastAPI, если тело необязательно, но если требуется, вы можете сделать from fastapi import Body
, а затем user: _schemas.User = Body(...)
спасибо - функция почты работает отлично!
Определение функции для
update_User()
кажется очень странным. В чем смыслid = int
? int - это тип. Я думаю, может быть, вы имели в видуid: int
? В чем смыслuser = _schemas.User
? Это присваивает пользователю объект классаUser
. Вы намеревались использовать значениеid
для поиска объектаuser
?