|
| 1 | +# Usando Dataclasses |
| 2 | + |
| 3 | +FastAPI é construído em cima do **Pydantic**, e eu tenho mostrado como usar modelos Pydantic para declarar requisições e respostas. |
| 4 | + |
| 5 | +Mas o FastAPI também suporta o uso de <a href="https://docs.python.org/3/library/dataclasses.html" class="external-link" target="_blank">`dataclasses`</a> da mesma forma: |
| 6 | + |
| 7 | +```Python hl_lines="1 7-12 19-20" |
| 8 | +{!../../docs_src/dataclasses/tutorial001.py!} |
| 9 | +``` |
| 10 | + |
| 11 | +Isso ainda é suportado graças ao **Pydantic**, pois ele tem <a href="https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel" class="external-link" target="_blank">suporte interno para `dataclasses`</a>. |
| 12 | + |
| 13 | +Então, mesmo com o código acima que não usa Pydantic explicitamente, o FastAPI está usando Pydantic para converter essas dataclasses padrão para a versão do Pydantic. |
| 14 | + |
| 15 | +E claro, ele suporta o mesmo: |
| 16 | + |
| 17 | +* validação de dados |
| 18 | +* serialização de dados |
| 19 | +* documentação de dados, etc. |
| 20 | + |
| 21 | +Isso funciona da mesma forma que com os modelos Pydantic. E na verdade é alcançado da mesma maneira por baixo dos panos, usando Pydantic. |
| 22 | + |
| 23 | +/// info | Informação |
| 24 | + |
| 25 | +Lembre-se de que dataclasses não podem fazer tudo o que os modelos Pydantic podem fazer. |
| 26 | + |
| 27 | +Então, você ainda pode precisar usar modelos Pydantic. |
| 28 | + |
| 29 | +Mas se você tem um monte de dataclasses por aí, este é um truque legal para usá-las para alimentar uma API web usando FastAPI. 🤓 |
| 30 | + |
| 31 | +/// |
| 32 | + |
| 33 | +## Dataclasses em `response_model` |
| 34 | + |
| 35 | +Você também pode usar `dataclasses` no parâmetro `response_model`: |
| 36 | + |
| 37 | +```Python hl_lines="1 7-13 19" |
| 38 | +{!../../docs_src/dataclasses/tutorial002.py!} |
| 39 | +``` |
| 40 | + |
| 41 | +A dataclass será automaticamente convertida para uma dataclass Pydantic. |
| 42 | + |
| 43 | +Dessa forma, seu esquema aparecerá na interface de documentação da API: |
| 44 | + |
| 45 | +<img src="/img/tutorial/dataclasses/image01.png"> |
| 46 | + |
| 47 | +## Dataclasses em Estruturas de Dados Aninhadas |
| 48 | + |
| 49 | +Você também pode combinar `dataclasses` com outras anotações de tipo para criar estruturas de dados aninhadas. |
| 50 | + |
| 51 | +Em alguns casos, você ainda pode ter que usar a versão do Pydantic das `dataclasses`. Por exemplo, se você tiver erros com a documentação da API gerada automaticamente. |
| 52 | + |
| 53 | +Nesse caso, você pode simplesmente trocar as `dataclasses` padrão por `pydantic.dataclasses`, que é um substituto direto: |
| 54 | + |
| 55 | +```{ .python .annotate hl_lines="1 5 8-11 14-17 23-25 28" } |
| 56 | +{!../../docs_src/dataclasses/tutorial003.py!} |
| 57 | +``` |
| 58 | + |
| 59 | +1. Ainda importamos `field` das `dataclasses` padrão. |
| 60 | + |
| 61 | +2. `pydantic.dataclasses` é um substituto direto para `dataclasses`. |
| 62 | + |
| 63 | +3. A dataclass `Author` inclui uma lista de dataclasses `Item`. |
| 64 | + |
| 65 | +4. A dataclass `Author` é usada como o parâmetro `response_model`. |
| 66 | + |
| 67 | +5. Você pode usar outras anotações de tipo padrão com dataclasses como o corpo da requisição. |
| 68 | + |
| 69 | + Neste caso, é uma lista de dataclasses `Item`. |
| 70 | + |
| 71 | +6. Aqui estamos retornando um dicionário que contém `items`, que é uma lista de dataclasses. |
| 72 | + |
| 73 | + O FastAPI ainda é capaz de <abbr title="converter os dados para um formato que pode ser transmitido">serializar</abbr> os dados para JSON. |
| 74 | + |
| 75 | +7. Aqui o `response_model` está usando uma anotação de tipo de uma lista de dataclasses `Author`. |
| 76 | + |
| 77 | + Novamente, você pode combinar `dataclasses` com anotações de tipo padrão. |
| 78 | + |
| 79 | +8. Note que esta *função de operação de rota* usa `def` regular em vez de `async def`. |
| 80 | + |
| 81 | + Como sempre, no FastAPI você pode combinar `def` e `async def` conforme necessário. |
| 82 | + |
| 83 | + Se você precisar de uma atualização sobre quando usar qual, confira a seção _"Com pressa?"_ na documentação sobre [`async` e `await`](../async.md#in-a-hurry){.internal-link target=_blank}. |
| 84 | + |
| 85 | +9. Esta *função de operação de rota* não está retornando dataclasses (embora pudesse), mas uma lista de dicionários com dados internos. |
| 86 | + |
| 87 | + O FastAPI usará o parâmetro `response_model` (que inclui dataclasses) para converter a resposta. |
| 88 | + |
| 89 | +Você pode combinar `dataclasses` com outras anotações de tipo em muitas combinações diferentes para formar estruturas de dados complexas. |
| 90 | + |
| 91 | +Confira as dicas de anotação no código acima para ver mais detalhes específicos. |
| 92 | + |
| 93 | +## Saiba Mais |
| 94 | + |
| 95 | +Você também pode combinar `dataclasses` com outros modelos Pydantic, herdar deles, incluí-los em seus próprios modelos, etc. |
| 96 | + |
| 97 | +Para saber mais, confira a <a href="https://docs.pydantic.dev/latest/concepts/dataclasses/" class="external-link" target="_blank">documentação do Pydantic sobre dataclasses</a>. |
| 98 | + |
| 99 | +## Versão |
| 100 | + |
| 101 | +Isso está disponível desde a versão `0.67.0` do FastAPI. 🔖 |
0 commit comments