Update an object using seta ttr | Journal

Update an object using seta ttr

May 10, 2024
#python #pydantic #fastapi
Have you ever needed to update fields in your Python project efficiently? One powerful tool for this task is the setattr function, especially when combined with Pydantic models. Let's dive into a practical example to see how you can leverage these tools for performing updates.

Example: Updating an Object

Imagine you have a project that you need to update. You might be fetching this project from your database and then applying changes based on input from a Pydantic model. Here's a streamlined way to achieve this:
python
project = await get_project(project_id, session, db)
for field, value in body.model_dump(exclude_unset=True, exclude_none=True).items():
    setattr(project, field, value)
db.commit()
return project

Breaking Down the Code

  1. Fetching the Project:
    1. python
      project = await get_project(project_id, session, db)
      
      Here, you retrieve the project from the database using its ID.
  1. Preparing Data for Update:
    1. python
      for field, value in body.model_dump(exclude_unset=True, exclude_none=True).items():
      
      Using Pydantic's model_dump method, you extract the fields and values to be updated. The exclude_unset and exclude_none parameters ensure that only the provided fields are updated, avoiding unnecessary changes.
  1. Validating Data:
    1. python
      if field == "language" and value not in PROJECT_ALLOWED_LANGUAGES:
          raise HTTPException(status_code=400, detail="Unsupported language")
      
      Before applying changes, you validate the input. In this case, if the language field contains an unsupported value, an exception is raised.
  1. Applying Updates:
    1. python
      setattr(project, field, value)
      
      The setattr function dynamically sets the attribute on the project object to the new value.
  1. Saving Changes:
    1. python
      db.commit()
      
      Finally, you commit the changes to the database to make them persistent.

Why Use setattr with Pydantic?

  • Efficiency: setattr allows you to update multiple fields dynamically without hardcoding each attribute.
  • Flexibility: Pydantic’s model_dump method provides a clean way to manage updates, filtering out unset and None values.
  • Safety: Combined with validation checks, this approach ensures only valid data is saved.
Â