如何重构Python中PUT请求的None检查后多属性赋值代码?
简化PUT请求中的属性赋值逻辑
你当前的代码重复了大量「检查属性非None再赋值」的冗余逻辑,完全可以通过以下几种方式简化:
方法一:遍历指定属性列表
直接列出需要同步的属性名,循环处理赋值逻辑:
def books_put(db: Session, db_book: schemas.Book, book: schemas.BookPut): # 列出需要更新的属性名称 update_fields = ["name", "pages", "author", "genre", "publishing_house"] for field in update_fields: field_value = getattr(book, field) if field_value is not None: setattr(db_book, field, field_value)
方法二:利用Pydantic模型特性(推荐)
如果你的schemas.BookPut是Pydantic的BaseModel子类,可以直接通过模型自带的方法提取非None属性,批量赋值:
def books_put(db: Session, db_book: schemas.Book, book: schemas.BookPut): # 获取所有值不为None的属性键值对 update_data = book.dict(exclude_none=True) # 批量更新db_book的属性 for key, value in update_data.items(): setattr(db_book, key, value)
这种方式的优势是后续BookPut新增属性时,无需修改这段赋值代码,自动适配新字段。
方法三:直接通过SQLAlchemy更新数据库(若适用)
如果db_book是SQLAlchemy的ORM实例,还可以直接用ORM的update方法批量更新数据库:
def books_put(db: Session, db_book: schemas.Book, book: schemas.BookPut): update_data = book.dict(exclude_none=True) db.query(schemas.Book).filter_by(id=db_book.id).update(update_data) db.commit()
这种方式跳过内存中实例的修改,直接操作数据库,适合不需要先修改实例再做其他处理的场景。
内容的提问来源于stack exchange,提问作者X HOxha
相关产品推荐
相关产品推荐

