본문 바로가기
프레임워크 & 라이브러리/Flask & Django

[Django/에러조치] It is impossible to add the field 'created_at' with 'auto_now_add=True' to post without providing a default...

by 뒹굴거리는프로도 2024. 2. 23.
반응형

 


 

*model.py

from django.db import models

# Create your models here

class Post(models.Model):
    title = models.CharField(max_length=30)
    content = models.TextField()
	
    #이 부분을 수정했었음.
    created_at = models.DateTimeField(auto_now_add=True)
    update_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f'[{self.pk}][{self.title}]'

 

models.py에서 Post 클래스를 수정하다가 해당 에러를 만난 적이 있으십니까?

저는 create_at이라고 작성해야하는 부분을 처음에 created로 해놓고 코드를 작성했어요. 웹 브라우저에서 내용을 확인한 후, 필드 이름을 create_at으로 다시 바꿨지요. 그리고 makemigrations 했다가 (필드명 수정 후, 테이블을 생성하려고 함) 이런 에러를 만났는데요.

This is because the database needs something to populate existing rows. 

1) Provide a one-off default now which will be set on all existing rows

2) Quit and manually define a default value in models.py.

Select an option:

 

왜 이런 에러가 발생했냐면,  created_at 필드 자체가 아직 없는데 인자로 auto_now_add를 넣고 DB에 반영하려고 해서 그래요.

시스템은 auto_now_add 인자를 반영하려는데 default 값이 없으니 지정해달라고 할거에요.

 

이제 조치 방법 알려드리겠습니다. 에러 문구에서 하단 내용이 보이시지요?

 This is because the database needs something to populate existing rows. 

1) Provide a one-off default now which will be set on all existing rows

 

코맨드창이 Select an option: 을 주면서 1) 또는 2)를 입력하라고 할 텐데, 1을 작성하고 엔터를 누릅니다.

 

그러면 

Please enter the default value as valid Python.
Accept the default 'timezone.now' by pressing 'Enter' or provide another value.
The datetime and django.utils.timezone modules are available, so it is possible to provide e.g. timezone.now as a value.

Type 'exit' to exit this prompt
[default: timezone.now] >>>

 

이런 문구가 나옵니다. >>> 뒤에 timezone.now를 작성하고 엔터를 누르면 됩니다.

 

제가 처음에 잘못 작성했던 created가 필드가 삭제되고, create_at 필드가 추가되었다는 메시지를 볼 수 있어요.

Migrations for 'blog':
  blog\migrations\0002_remove_post_created_post_created_at_post_update_at.py
    - Remove field created from post
    - Add field created_at to post
    - Add field update_at to post

 

그리고 서버를 바로 실행시키지 않고 python manage.py migrate 를 통하여 migrate 합니다. 

python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0002_remove_post_created_post_created_at_post_update_at... OK

 

이제 에러가 안 날거에요. 웹 개발자들 화이팅!

 


 

반응형