首页 > 解决方案 > 使用 Pydantic 和 Motor 创建 ISODate

问题描述

我正在使用 FastAPI、Pydantic 和Motor创建一个简单的后端。这是 Python 中的数据模型描述:

from datetime import datetime, date
from pydantic import BaseModel, Field, validator


class ContactModel(BaseModel):
    """
    Task MongoDB model: Ignoring _id since it use ObjectId
    """

    firstname: str = Field(...)
    surname: str = Field(...)
    birthday: datetime
    location: str = Field(...)

    @validator("birthday", pre=True)
    def parse_birthday(cls, value):
        birthday = datetime.strptime(value, "%d-%m-%Y")
        return birthday

POST 路由器的 FastAPI 函数是这样写的:

@router.post("/", response_description="Add new contact")
async def create_contact(request: Request, contact: ContactModel = Body(...)):
    json_contact = jsonable_encoder(contact)
    new_contact = await request.app.mongodb[collection].insert_one(json_contact)

    created_contact = await request.app.mongodb[collection].find_one(
        {"name": new_contact.inserted_id}
    )
    return JSONResponse(status_code=status.HTTP_201_CREATED, content=created_contact)

用我的后端发送一个新条目后,我的 Mongo Shell 的输出没有显示生日字段的 ISOData:

{ "_id" : ObjectId("60a126ec73407fc9aea5c1df"), "firstname" : "Andy", "surname" : "Gray", "birthday" : "2002-03-01T00:00:00", "location" : "Paris" }

我的实施有什么问题?一般来说,如果我只需要日期,为什么要使用 ISODate 而不是日期字符串?

标签: python-3.xmongodbfastapipydantic

解决方案


推荐阅读