Как использовать различные модели 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))
Вернуться на верх