Как использовать различные модели Pydantic Models в представлении
В настоящее время я пытаюсь понять настройку Pydantic FastAPI в моем приложении Django и столкнулся со следующей проблемой:
Когда я создаю новый Order
объект, я хочу вернуть только что созданный объект, используя другую пидантическую модель, которую я использую для создания (поскольку после создания у меня теперь есть ID заказа, который я также могу вернуть).
# routes
# Create a new Order
@router.post("/create/", response_model=schemas.OrderResponse)
def create_orders(order: schemas.OrderBase):
return views.create_order(order=order)
# views.py
from uuid import UUID
from . import models, schemas
# Create a new order
def create_order(order: schemas.OrderBase):
new_order = models.Order.objects.get_or_create(order)
return new_order
# schemas.py
# pydantic models
from uuid import UUID
from pydantic import BaseModel
# Base Class for Model "Order"
class OrderBase(BaseModel):
product: str
period: str
power: int
side: str
class Config:
orm_mode = True
class OrderResponse(OrderBase):
id: UUID
Когда я отправляю запрос API с таким телом:
{
"product": "Base",
"period": "Hour",
"power": 10,
"side": "Buy"
}
Я получаю эту ошибку - как настроить ее так, чтобы при создании экземпляра она не проверяла UUID, а после создания и возврата экземпляра включала UUID в ответ?
pydantic.error_wrappers.ValidationError: 5 validation errors for OrderResponse
response -> product
field required (type=value_error.missing)
response -> period
field required (type=value_error.missing)
response -> power
field required (type=value_error.missing)
response -> side
field required (type=value_error.missing)
response -> id
field required (type=value_error.missing)
Похоже, что автоматическое преобразование экземпляра модели django в pydantic не поддерживается в fastAPI. Поэтому я добавил код, который конвертирует вашу модель в dict, и этот dict будет инициировать экземпляр OrderResponse.
Попробуйте это,
from django.forms.models import model_to_dict
...
@router.post("/create/", response_model=schemas.OrderResponse)
def create_orders(order: schemas.OrderBase):
return model_to_dict(views.create_order(order=order))