1# Corpo - Atualizações { #body-updates }23## Atualização substituindo com `PUT` { #update-replacing-with-put }45Para atualizar um item, você pode usar a operação [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT).67Você pode usar `jsonable_encoder` para converter os dados de entrada em dados que podem ser armazenados como JSON (por exemplo, com um banco de dados NoSQL). Por exemplo, convertendo `datetime` em `str`.89{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *}1011`PUT` é usado para receber dados que devem substituir os dados existentes.1213### Aviso sobre a substituição { #warning-about-replacing }1415Isso significa que, se você quiser atualizar o item `bar` usando `PUT` com um corpo contendo:1617```Python18{19 "name": "Barz",20 "price": 3,21 "description": None,22}23```2425como ele não inclui o atributo já armazenado `"tax": 20.2`, o modelo de entrada assumiria o valor padrão de `"tax": 10.5`.2627E os dados seriam salvos com esse "novo" `tax` de `10.5`.2829## Atualizações parciais com `PATCH` { #partial-updates-with-patch }3031Você também pode usar a operação [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) para atualizar dados *parcialmente*.3233Isso significa que você pode enviar apenas os dados que deseja atualizar, deixando o restante intacto.3435/// note | Nota3637`PATCH` é menos comumente usado e conhecido do que `PUT`.3839E muitas equipes usam apenas `PUT`, mesmo para atualizações parciais.4041Você é **livre** para usá-los como preferir, **FastAPI** não impõe restrições.4243Mas este guia mostra, mais ou menos, como eles são destinados a serem usados.4445///4647### Usando o parâmetro `exclude_unset` do Pydantic { #using-pydantics-exclude-unset-parameter }4849Se você quiser receber atualizações parciais, é muito útil usar o parâmetro `exclude_unset` no `.model_dump()` do modelo do Pydantic.5051Como `item.model_dump(exclude_unset=True)`.5253Isso geraria um `dict` com apenas os dados que foram definidos ao criar o modelo `item`, excluindo os valores padrão.5455Então, você pode usar isso para gerar um `dict` com apenas os dados definidos (enviados na solicitação), omitindo valores padrão:5657{* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *}5859### Usando o parâmetro `update` do Pydantic { #using-pydantics-update-parameter }6061Agora, você pode criar uma cópia do modelo existente usando `.model_copy()`, e passar o parâmetro `update` com um `dict` contendo os dados para atualizar.6263Como `stored_item_model.model_copy(update=update_data)`:6465{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *}6667### Recapitulando as atualizações parciais { #partial-updates-recap }6869Resumindo, para aplicar atualizações parciais você deveria:7071* (Opcionalmente) usar `PATCH` em vez de `PUT`.72* Recuperar os dados armazenados.73* Colocar esses dados em um modelo do Pydantic.74* Gerar um `dict` sem valores padrão a partir do modelo de entrada (usando `exclude_unset`).75 * Dessa forma, você pode atualizar apenas os valores realmente definidos pelo usuário, em vez de substituir valores já armazenados por valores padrão do modelo.76* Criar uma cópia do modelo armazenado, atualizando seus atributos com as atualizações parciais recebidas (usando o parâmetro `update`).77* Converter o modelo copiado em algo que possa ser armazenado no seu BD (por exemplo, usando o `jsonable_encoder`).78 * Isso é comparável a usar o método `.model_dump()` do modelo novamente, mas garante (e converte) os valores para tipos de dados que possam ser convertidos em JSON, por exemplo, `datetime` para `str`.79* Salvar os dados no seu BD.80* Retornar o modelo atualizado.8182{* ../../docs_src/body_updates/tutorial002_py310.py hl[28:35] *}8384/// tip | Dica8586Você pode realmente usar essa mesma técnica com uma operação HTTP `PUT`.8788Mas o exemplo aqui usa `PATCH` porque foi criado para esses casos de uso.8990///9192/// note | Nota9394Observe que o modelo de entrada ainda é validado.9596Portanto, se você quiser receber atualizações parciais que possam omitir todos os atributos, você precisa ter um modelo com todos os atributos marcados como opcionais (com valores padrão ou `None`).9798Para distinguir entre os modelos com todos os valores opcionais para **atualizações** e modelos com valores obrigatórios para **criação**, você pode usar as ideias descritas em [Modelos Adicionais](extra-models.md).99100///
Findings
✓ No findings reported for this file.