Django 모델 양식 객체의 자동 생성 날짜?


153

객체의 생성 날짜를 자동으로 설정하는 가장 좋은 방법과 객체가 마지막으로 업데이트 된시기를 기록하는 필드는 무엇입니까?

models.py :

created_at = models.DateTimeField(False, True, editable=False)
updated_at = models.DateTimeField(True, True, editable=False)

views.py :

if request.method == 'POST':
    form = MyForm(request.POST)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        obj.save()
        return HttpResponseRedirect('obj_list')

오류가 발생합니다.

objects_object.created_at may not be NULL

이 값을 직접 설정해야합니까? 나는에 전달 된 매개 변수의 포인트라고 생각 DateTimeField(또는 그들은 단지 기본값이고, 내가 설정 한 이후로 editable=False그들은 양식에 표시되지 않습니다 따라서 요청에 제출되지 않는, 따라서하지 않는다 양식에 넣습니까?).

가장 좋은 방법은 무엇입니까? __init__방법은?

답변:


312

및에 각각 auto_nowauto_now_add옵션을 사용할 수 있습니다 .updated_atcreated_at

class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

31
auto_now그리고 auto_now_add악한 생각, 그래서 그들을 피하기 위해 노력하고 있습니다. 이 답변 은 이유를 설명하고 더 나은 방법을 제공하여 방법을 재정의합니다 save().
gregoltsov

3
You are trying to add a non-nullable field 'created_at' to gameuser without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows) 2) Quit, and let me add a default in models.py Select an option: 1 Please enter the default value now, as valid Python The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now() >>> timezone.now()
Kaleem Ullah

1
데이터베이스에서 행을 삭제하거나 옵션 1을 확인하고 timezone.now () 추가
mullerivan


1
@gregoltsov의 의견이 현재 시점에서 오래된 것 같습니다. 사용 auto_now_add하거나 auto_now잘 작동합니다. 모델을 저장하기 전에 필드를 설정합니다 ( github.com/django/django/blob/stable/3.0.x/django/db/models/… ).
yndolok

26

위의 대답은 맞습니다. auto_now_addauto_now 는 그렇게하지만 추상 클래스를 만들고 필요한 필드 created_at와 모든 모델에서 사용하는 것이 좋습니다 updated_at.

class TimeStampMixin(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

이제 어디서나 사용하고 싶은 간단한 상속을 수행 할 수 있으며 원하는 모델에서 타임 스탬프를 사용할 수 있습니다.

class Posts(TimeStampMixin):
    name = models.CharField(max_length=50)
    ...
    ...

이런 방식으로 Django DRY에서 객체 지향 재사용 성을 활용할 수 있습니다 (반복하지 마십시오)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.