스택큐힙리스트

장고 auto_now와 auto_now_add 본문

카테고리 없음

장고 auto_now와 auto_now_add

스택큐힙리스트 2023. 4. 24. 08:35
반응형

Django 1.1에 대해.

제 models.py에는 이게 있습니다:

class User(models.Model):

created = models.DateTimeField(auto_now_add=True)

modified = models.DateTimeField(auto_now=True)

행을 업데이트하면 다음과 같은 결과가 나타납니다.

[Sun Nov 15 02:18:12 2009] [error] /home/ptarjan/projects/twitter-meme/django/db/backends/mysql/base.py:84: Warning: Column 'created' cannot be null

[Sun Nov 15 02:18:12 2009] [error] return self.cursor.execute(query, args)

저의 데이터베이스의 관련 부분은 다음과 같습니다.

`created` datetime NOT NULL,

`modified` datetime NOT NULL,

이것이 우려의 소지가 있나요?

부가 질문: 내 관리 도구에서 이 두 필드가 나타나지 않습니다. 그게 예상한 것인가요?

답변 1

어떤 필드에 auto_now 속성이 설정되면 itable=False and 을 상속받아서 관리자 패널에 표시되지 않습니다. 과거에는 auto_now 및 auto_now_add 인수를 제거하려는 이야기가 있었지만, 여전히 존재하기 때문에 custom save() method를 사용하는 것이 더 나은 것 같습니다.

그래서 이것을 제대로 작동하도록 하려면, auto_now 또는 auto_now_add 대신에 자신만의 save() 메서드를 정의하여 아이템이 처음 생성될 때 $$#&#^!*$$&이 설정되지 않은 경우에만 업데이트되도록하고 모든 아이템이 저장될 때마다 modified를 업데이트하도록 권장합니다.

저는 Django를 사용하여 작성한 다른 프로젝트에서도 정확히 같은 것을 수행했으며, 따라서 당신의 save()는 이렇게 보일 것입니다 :

from django.utils import timezone

class User(models.Model):

created = models.DateTimeField(editable=False)

modified = models.DateTimeField()

def save(self, *args, **kwargs):

''' On save, update timestamps '''

if not self.id:

self.created = timezone.now()

self.modified = timezone.now()

return super(User, self).save(*args, **kwargs)

의견에 따른 수정:

나는 이 필드 인수들에 의존하기보다는 과부하 save() 를 사용하는 이유가 이중입니다.

상기한 신뢰성과 함께한 좋고 나쁜 점. 이러한 주장들은 Django가 상호 작용할 수 있는 각 유형의 데이터베이스가 날짜 / 시간 스탬프 필드를 처리하는 방식에 매우 의존하며, 매 버전마다 중단되거나 / 또는 변경되는 것으로 보입니다. (제가 그것들 전부 제거하도록 요청하는 호출의 원동력 인 것으로 생각합니다).

그들이 DateField, DateTimeField, TimeField에서만 작동한다는 사실 때문에 이 기술을 사용하여 모든 필드 유형을 자동으로 채울 수 있습니다. 이것은 항목이 저장될 때마다 가능합니다.

django.utils.timezone.now() 대신 datetime.datetime.now()를 사용하십시오. settings.USE_TZ에 따라 TZ-aware 또는 naive datetime.datetime 개체를 반환하기 때문입니다.

OP가 오류를 보았던 이유를 다루기 위해, 정확히는 모르겠지만, created 가 auto_now_add=True 을 가지고 있음에도 불구하고 전혀 채워지지 않는 것 같습니다. 저에게는 버그로 보입니다. 이것은 위에서 나열한 항목 #1을 강조하며, auto_now 및 auto_now_add 는 최상의 지침을 따르지 않습니다.

답변 2

Django 개발 환경에서는 데이터베이스에 저장되는 모델 필드에 대한 자동화된 날짜 업데이트 함수인 auto_now와 auto_now_add를 제공합니다. 이 기능은 특정한 날짜와 시간 정보를 데이터베이스 필드에 저장하고, 이를 통해 데이터의 수정 및 업데이트 시점을 확인할 수 있습니다.

auto_now 함수는 데이터가 수정될 때마다 이를 감지하여 해당 날짜와 시간 정보를 자동으로 저장합니다. 데이터를 저장하기 전에 매번 업데이트를 거치므로 실제 수정 시간이 저장됩니다. 이에 반해 auto_now_add 함수는 데이터가 새로 추가될 때 이를 감지하여 해당 날짜와 시간 정보를 자동으로 저장합니다. 새로운 데이터를 추가할 때의 시간 정보를 저장하여, 데이터가 최초로 저장된 시점을 확인할 수 있습니다.

이러한 기능은 데이터의 수정 및 업데이트를 모니터링하고 추적하기 위해 매우 유용합니다. Django 애플리케이션에서는 이 기능을 활용해 변경 이력 관리, 로깅 기능, 보안 강화 등 다양한 목적으로 활용할 수 있습니다.

또한, 이 기능은 검색 엔진 최적화에도 도움이 됩니다. 검색 엔진은 웹페이지의 변경 이력을 추적하고, 최신 정보를 제공하기 위해 자주 업데이트되는 사이트를 선호합니다. Django에서 auto_now와 auto_now_add를 활용하면 모델 필드에 저장되는 시간 정보를 활용하여 최신 정보를 갱신하는 것이 가능합니다. 이를 통해 검색 엔진 최적화에 기여할 수 있습니다.

결론적으로, Django의 auto_now와 auto_now_add 기능은 데이터의 수정 및 업데이트 시점을 추적하고 관리하는 데 매우 유용합니다. 이 기능은 변경 이력 관리부터 검색 엔진 최적화까지 다양한 목적으로 사용될 수 있기 때문에, Django 개발자들은 이를 적극 활용하여 더욱 효율적인 애플리케이션 개발을 이끌어 나갈 필요가 있습니다.

반응형
Comments