Как обрабатывать пользовательский формат даты (дд/мм/гггг) в параметрах запроса с унаследованной моделью?Python

Программы на Python
Ответить
Anonymous
 Как обрабатывать пользовательский формат даты (дд/мм/гггг) в параметрах запроса с унаследованной моделью?

Сообщение Anonymous »

Я создаю приложение FastAPI (на самом деле небольшой пакет), которое определяет базовую модель для конечной точки веб-перехватчика. Другие разработчики могут наследовать эту модель и расширять ее для своих собственных сценариев использования.
Вебхук, вызывающий эту конечную точку, отправляет параметры запроса в фиксированном формате, который я не могу изменить — я не контролирую отправку запроса, я могу только определить, как его получит мой код.
Одним из параметров является дата, отправленная в формате дд/мм/гггг, например:

Код: Выделить всё

?ParamA=123&ParamB=456&Date=09/10/2025&Time=12:30:00
Похоже, что FastAPI (или Pydantic v2) пытается проанализировать параметр запроса как дату перед запуском моего валидатора. FastAPI (с Pydantic v2) ожидает даты ISO, такие как 2025-10-09, и не проходит проверку, когда получает 10.09.2025.
Я пытаюсь:
  • Принять дату в формате дд/мм/гггг
  • Сохранять поле с типом даты в модели и схеме OpenAPI.
  • Разрешить другим наследовать базовую модель и добавлять/переопределять поля.
  • Избегайте синтаксического анализа параметров запроса вручную в каждой конечной точке.
  • Обрабатывайте этот формат корректно, поскольку я не могу изменить способ веб-перехватчика. отправляет его
Как правильно в FastAPI + Pydantic v2 обрабатывать формат даты, отличный от ISO, в параметрах запроса, сохраняя при этом правильную работу проверки типа и схемы OpenAPI — особенно когда источник данных (веб-перехватчик) отправляет фиксированный формат, который я не могу изменить?
Пример расширения базовой модели:

Код: Выделить всё

from datetime import datetime, date, time
from pydantic import BaseModel, Field, field_validator
from fastapi import FastAPI, Depends

app = FastAPI()

class BaseWebhookModel(BaseModel):
date_field: date = Field(alias="Date")

@field_validator("date_field", mode="before")
def parse_date_field(cls, v):
if isinstance(v, str):
return datetime.strptime(v, "%d/%m/%Y").date()
return v

# Example of extending the base model
class WebhookModel(BaseWebhookModel):
extra_field: str = Field(alias="ExtraField")
status: str = Field(alias="Status")

@app.get("/test")
def test_api(param: WebhookModel = Depends()):
return {"param": param}

Когда я звоню:

Код: Выделить всё

/test?Date=09/10/2025&ExtraField=foo&Status=bar
Я получаю эту ошибку:

Код: Выделить всё

{
"detail": [
{
"type": "date_from_datetime_parsing",
"loc": ["query", "Date"],
"msg": "Input should be a valid date or datetime, invalid character in year",
"input": "09/10/2025",
"ctx": {"error": "invalid character in year"}
}
]
}

Я тоже пробовал:

Код: Выделить всё

date_field: date = Field(Query(alias="Date"))
но это не помогло.

Подробнее здесь: https://stackoverflow.com/questions/797 ... erited-mod
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»