장고 날짜 시간 문제 (default = datetime.now ())
아래 db 모델이 있습니다.
from datetime import datetime
class TermPayment(models.Model):
# I have excluded fields that are irrelevant to the question
date = models.DateTimeField(default=datetime.now(), blank=True)
아래를 사용하여 새 인스턴스를 추가합니다.
tp = TermPayment.objects.create(**kwargs)
내 문제 : 데이터베이스의 모든 레코드는 첫 번째 지불 날짜 인 날짜 필드의 값이 동일합니다. 서버가 다시 시작된 후 한 레코드는 새로운 날짜를 가지며 다른 레코드는 첫 번째 레코드와 동일합니다. 일부 데이터가 캐시 된 것처럼 보이지만 어디에서 찾을 수 없습니다.
데이터베이스 : mysql 5.1.25
장고 v1.1.1
datetime.now()
레코드를 추가 할 때마다가 아니라 모델을 정의 할 때 평가되는 것처럼 보입니다 .
Django에는 이미 수행하려는 작업을 수행하는 기능이 있습니다.
date = models.DateTimeField(auto_now_add=True, blank=True)
또는
date = models.DateTimeField(default=datetime.now, blank=True)
두 번째 예와 현재 가지고있는 것의 차이점은 괄호가 없다는 것입니다. 전달하여 datetime.now
괄호없이, 당신은 레코드가 추가 될 때마다 호출되는 실제 함수를 전달한다. 전달 datetime.now()
하면 함수를 평가하고 반환 값을 전달하는 것입니다.
자세한 내용은 Django의 모델 필드 참조 에서 확인할 수 있습니다
사용하는 대신 datetime.now
실제로 사용해야합니다.from django.utils.timezone import now
참고:
- 에 대한 설명서
django.utils.timezone.now
다음과 같이하십시오 :
from django.utils.timezone import now
created_date = models.DateTimeField(default=now, editable=False)
django 모델 기본 필드 의 문서 에서 :
필드의 기본값입니다. 이것은 값 또는 호출 가능한 객체 일 수 있습니다. 호출 가능하면 새로운 객체가 생성 될 때마다 호출됩니다.
따라서 다음과 같이 작동합니다.
date = models.DateTimeField(default=datetime.now,blank=True)
다윗은 정답을 얻었습니다. 괄호 ()는 모델을 평가할 때마다 호출 가능한 timezone.now ()가 호출 되도록합니다 . timezone.now () (또는 순진한 datetime 객체를 사용하는 경우 datetime.now ())에서 ()를 제거하면 다음과 같이됩니다.
default=timezone.now
그런 다음 예상대로 작동합니다.
새 객체는 객체가 생성 될 때 현재 날짜를 수신하지만 manage.py makemigrations / migrate를 수행 할 때마다 날짜가 무시되지 않습니다.
방금이 문제가 발생했습니다. 다윗에게 감사드립니다.
는 datetime.now()
클래스가 생성 될 때 새로운 기록이 데이터베이스에 추가 될하지 않을 경우, 평가됩니다.
원하는 것을 달성하려면이 필드를 다음과 같이 정의하십시오.
date = models.DateTimeField(auto_now_add=True)
이런 식으로 date
필드는 각 새 레코드의 현재 날짜로 설정됩니다.
이것에 대한 대답은 실제로 잘못되었습니다.
자동 입력 값 (auto_now / auto_now_add는 기본값과 동일하지 않음) 기본값은 실제로 새로운 객체인지 사용자가 보는 것입니다. 내가 일반적으로하는 일은 다음과 같습니다.
date = models.DateTimeField(default=datetime.now, editable=False,)
관리자 페이지에서이를 표시하려는 경우 'read_only'로 나열하고 필드 이름을 참조하십시오
read_only = 'date'
기본 값은 일반적으로 편집 할 수 없으므로 달리 지정하지 않는 한 관리 페이지는 편집 할 수없는 항목을 무시합니다. 그러나 기본값 설정과 여기서 중요한 auto_add 구현에는 차이가 있습니다. 그것을 테스트하십시오!
datetime.now()
클래스가 인스턴스화되면 한 번 평가됩니다. 함수 datetime.now
가 리턴되고 THEN이 평가 되도록 괄호를 제거하십시오 . 내 기본값을 설정하는 것과 같은 문제가 있었고 여기에DateTimeField
내 솔루션을 작성했습니다 .
함수 정의 아래의 파이썬 언어 참조에서 :
함수 정의가 실행될 때 기본 매개 변수 값이 평가됩니다. 이는 함수가 정의 될 때 표현식이 한 번 평가되고 각 호출에 대해 동일한 "사전 계산 된"값이 사용됨을 의미합니다.
다행히 Django는 다음에 auto_now
인수를 사용하면 원하는 것을 수행 할 수있는 방법이 있습니다 DateTimeField
.
date = models.DateTimeField(auto_now=True)
DateTimeField에 대해서는 장고 문서를 참조하십시오 .
참고 URL : https://stackoverflow.com/questions/2771676/django-datetime-issues-default-datetime-now
'Programing' 카테고리의 다른 글
여러 명령의 Bash 종료 상태를 효율적으로 확인 (0) | 2020.04.05 |
---|---|
JavaScript 또는 jQuery를 사용하여 새 탭에서 URL을 여는 방법은 무엇입니까? (0) | 2020.04.05 |
HTML의 src 속성이 (0) | 2020.04.05 |
NameValuePair를 사용하여 POST를 사용하여 HttpURLConnection에 매개 변수를 추가하는 방법 (0) | 2020.04.05 |
숫자가 홀수인지 짝수인지 테스트 (0) | 2020.04.05 |