art049 / odmantic

Sync and Async ODM (Object Document Mapper) for MongoDB based on python type hints
http://art049.github.io/odmantic
ISC License
1.07k stars 94 forks source link

defaut for created_date and updated_date #105

Open jd-solanki opened 3 years ago

jd-solanki commented 3 years ago

Feature request

I just discovered this I really love it :heart:

Context

I was testing FastAPI and came to odmantic as I am using mongoDB. I have a question regarding creating a model. How can I define a default value for created_date and updated_date? Is there any equivalent to Django'sDateField.auto_now_addandDateField.auto_now`

Solution

Something like Django have I guess if possible.

Alternative solutions

Using default_factory for created_date (I haven't tested it yet btw) and none for modified_date

Additional context

None.

Regards

carlosfrutos commented 1 year ago

I just stumbled upon this question because I was having the same creation date in every object in my application:

So, if you use default to set the value, then you will always have the same value for every object instance: creation_date: datetime = Field(default=datetime.now(), alias="creation_date", description="Task creation date")

To get the current date/datetime every time, you need to use default_factory with the datetime.now or datetime.date.today method call: creation_date: datetime = Field(default_factory=datetime.now, description="Creation date")

Regards.

troywilson commented 3 months ago

I've been using:

from datetime import datetime, UTC
from odmantic import Field, Model
from pydantic import AwareDatetime
from pydantic.functional_validators import AfterValidator
from typing import Annotated, Any

def utc_now() -> datetime:
    return datetime.now(UTC)

def utc_now_validator(_: Any) -> Any:
    return utc_now()

UtcNowDatetime = Annotated[AwareDatetime, AfterValidator(utc_now_validator)]

class Example(Model):
    created_date: AwareDatetime = Field(default_factory=utc_now)
    modified_date: UtcNowDatetime = Field(default_factory=utc_now)