我正在使用Beanie ODM与MongoDB进行交互的Python项目,并且遇到了需要修改嵌套对象的情况。
具体来说,我正在处理包含嵌套作业对象的用户对象(除其他属性)。 这是我正在使用的模型的简化版本:from beanie import Document
from pydantic import BaseModel
class Job(BaseModel):
title: str
salary: int
class User(Document):
name: str
age: int
job: Job
从数据库中检索
用户
实例后,我有几个功能可以修改
用户
及其嵌套
job
对象。
from typing import Union
from beanie import init_beanie
from motor.motor_asyncio import AsyncIOMotorClient
import asyncio
async def fetch_user_by_name(name: str) -> Union[User, None]:
user = await User.find_one(User.name == name)
return user
def update_user_name(user: User, new_name: str) -> None:
user.name = new_name
def update_user_job(user: User, new_title: str, new_salary: int) -> None:
user.job.title = new_title
user.job.salary = new_salary
async def main():
# Initialize Beanie with database connection and document models
client = AsyncIOMotorClient("mongodb://localhost:27017")
await init_beanie(database=client.db_name, document_models=[User])
# Example usage
user = await fetch_user_by_name("Alice")
if user:
update_user_name(user, "Alice Updated")
update_user_job(user, "Senior Developer", 90000)
await user.save()
print("User and job updated successfully.")
else:
print("User not found.")
这是一个非常基本的示例,真实的示例更为复杂,并使用更多的方法来基于依赖关系以及所有这些操作。
。所以,这是我不确定的地方:我知道修改对象可能会导致意外行为,尤其是在较大的代码库或多线程环境中。
但是,由于Beanie返回我操纵的对象,因此我正在考虑处理此类修改的最佳方法。问题:
用Beanie ODM检索它们后,修改这些嵌套对象是否不良习惯?
在进行修改之前,最好创建对象的深度副本?
什么将被认为是更好的练习,为什么?