programing

Document의 Mongoengine creation_time 특성

powerit 2023. 7. 7. 21:11
반응형

Document의 Mongoengine creation_time 특성

추가하려고 합니다.creation_time내 문서에 귀속됩니다.다음은 예입니다.

import datetime

class MyModel(mongoengine.Document):
    creation_date = mongo.DateTimeField()
    modified_date = mongo.DateTimeField(default=datetime.datetime.now)

Django 모델에는 다음과 같은 매개 변수가 내장되어 있습니다.DateTimeField와 같은 물건add_now등, 그러나 MongoEngine은 이를 지원하지 않습니다.

이를 위한 최선의 방법은 다음과 같은 것인지 궁금합니다.

m,created = MyModel.objects.get_or_create()
if created:
    m.creation_date = datetime.datetime.now()

더 나은, 더 좋은 방법이 있다면요

저장 방법을 재정의할 수 있습니다.

class MyModel(mongoengine.Document):
    creation_date = mongo.DateTimeField()
    modified_date = mongo.DateTimeField(default=datetime.datetime.now)

    def save(self, *args, **kwargs):
        if not self.creation_date:
            self.creation_date = datetime.datetime.now()
        self.modified_date = datetime.datetime.now()
        return super(MyModel, self).save(*args, **kwargs)

별도로, 생성 시간은 다음과 같이 스탬프로 표시됩니다._id속성 - 다음을 수행하는 경우:

YourObject.id.generation_time

날짜 스탬프를 드리겠습니다.

한 가지 좋은 해결책은 단일 신호 처리기를 여러 문서에 재사용하는 것입니다.

class User(Document):
    # other fields...
    created_at = DateTimeField(required=True, default=datetime.utcnow)
    updated_at = DateTimeField(required=True)

class Post(Document):
    # other fields...
    created_at = DateTimeField(required=True, default=datetime.utcnow)
    updated_at = DateTimeField(required=True)

def update_timestamp(sender, document, **kwargs):
    document.updated_at = datetime.utcnow()

signals.pre_save.connect(update_timestamp, sender=User)
signals.pre_save.connect(update_timestamp, sender=Post)

예를 들어 고정 값이 아닌 호출 가능을 기본값으로 할당해야 합니다.default=datetime.utcnow없이.()이 페이지의 다른 답변 중 일부는 올바르지 않으며 이로 인해 발생할 수 있습니다.created_at새 문서를 항상 앱이 처음 로드된 시간으로 설정합니다.

또한 항상 UTC 날짜를 저장하는 것이 좋습니다(datetime.utcnow대신에datetime.now데이터베이스에 있습니다.

# -*- coding: utf-8 -*-
from mongoengine import *
from mongoengine import signals
from datetime import datetime

class User(Document):
    email = StringField(required=True, unique=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)
    # audit fields
    created_on = DateTimeField(default=datetime.now())
    updated_on = DateTimeField(default=datetime.now())

    @classmethod
    def pre_save(cls, sender, document, **kwargs):
        document.updated_on = datetime.now()

signals.pre_save.connect(User.pre_save, sender=User)

제가 선호하는 솔루션은@propertyObjectId에서 추출한 대로 작성 날짜를 반환하는 데코레이터:

@property
def creation_stamp(self):
    return self.id.generation_time

문서 집합에서 타임스탬프 필드를 사용하는 경우, 추상 문서를 대신 작성하여 코드를 건조 상태로 유지할 수 있습니다.

from datetime import datetime
from mongoengine import Document

class CreateUpdateDocument(Document):
    meta = {
        'abstract': True
    }

    # last updated timestamp
    updated_at = DateTimeField(default=datetime.now)

    # timestamp of when entry was created
    created_at = DateTimeField(default=datetime.now)

    def save(self, *args, **kwargs):
        if not self.created_at:
            self.created_at = datetime.now()
        self.updated_at = datetime.now()
        return super(CreateUpdateDocument, self).save(*args, **kwargs)

람다 값을 사용해 보십시오.

import datetime
from mongoengine import Document

class MyModel(Document):
    creation_date = mongo.DateTimeField()
    modified_date = mongo.DateTimeField(default=lambda : datetime.datetime.now())

전통적으로 다음과 같이 설정했습니다.creation_date에 결석한.datetime.now()그런 다음 관리 양식에서 필드를 숨겨 사용자가 올바른 값을 덮어쓸 가능성을 제거합니다.코드가 거의 필요하지 않습니다.

Willian이 제안한 대로 저장 방법을 재정의하는 것도 효과적입니다. 프로그램으로 업데이트를 차단할 수 있기 때문입니다.creation_date업데이트합니다.modfied_date동시에

설명서에 따라 auto_now_add 매개 변수를 사용할 수 있습니다.

class MyModel(mongoengine.Document):
    creation_date = mongo.DateTimeField(auto_now_add = True)
    modified_date = mongo.DateTimeField(auto_now = True)

언급URL : https://stackoverflow.com/questions/8098122/mongoengine-creation-time-attribute-in-document

반응형