Django | Seed data

Jihun Kim·2021년 10월 21일
0

Django

목록 보기
2/8
post-thumbnail
post-custom-banner

Django seed

모델에 정의된 필드를 보고 임의의 데이터를 자동으로 생성해 주는 패키지

설치하기

pip install django-seed

Installaed Apps
설치 후 settings.py로 가서 아래와 같이 django_seed를 추가한다.


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'posts',
    'django_seed'
]

seed 생성하기
터미널 창에서 원하는 app에 대한 seed를 하도록 명령어를 작성한다.
원하는 갯수를 number={개수}와 같은 형식으로 적으면 된다.
아래는 'posts' 앱의 models.py에 해당하는 seed이다.

$ python manage.py seed posts --number=50

그러면 아래와 같이 seed가 만들어지는 것을 볼 수 있다.

Seeding 50 Posts
Model Post generated record with primary key 18
Model Post generated record with primary key 19
...
Model Post generated record with primary key 67

이제 개발 서버를 실행하고 확인해 본다.

$ python manage.py runserver   

혹은 아래와 같이 django shell을 이용해 확인해 볼 수도 있다.

(django-envs) ☁  costory [master] ⚡  python manage.py shell
Python 3.7.7 (default, May 17 2021, 22:08:58)
[Clang 11.0.3 (clang-1103.0.32.62)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from posts.models import Post
>>> posts = Post.objects.all()
>>> print(len(posts))
56

실행이 안되는 경우
위와 같이 실행할 경우 "ModuleNotFoundError: No module named 'psycopg2'" 에러가 뜰 수 있다. 그럴 때는 아래와 같이 해당 모듈을 설치해 주면 된다.

$ pip install psycopg2


유효성 검증을 추가했을 때 기존 데이터 처리하기

예를 들어, 기존 데이터의 본문에는 & 기호가 추가 되어 있는데 새롭게 &를 추가하지 않는 유효성 검증을 넣었을 때 이를 처리할 필요가 생긴다.

"validate_data.py" 파일 하나를 생성한다.

여기에 기존에 있는 데이터를 새로 추가된 유효성 검증에 맞도록 만드는 로직을 작성한다.

수행 과정은 다음과 같다.

수행 과정
(posts 앱이라고 가정할 때: & 제거하기, 수정일 < 작성일인 경우 수정일을 최근(오늘)으로 변경하기)
1. 모든 posts 데이터 가져오기
2. 각각의 posts 데이터를 보며 내용 안에 &가 있는지 체크하기
3. 만약 &가 있다면 해당 & 삭제 처리
4. 데이터 저장하기

아래와 같이 작성 한다.

from .models import Post


def validate_post():
    posts = Post.objects.all()

    for post in posts:
        if '&' in post.content:
            post.content = post.content.replace('&', '')
            post.save()
        if post.dt_modified < post.dt_created:
            post.save()  # 저장을 함으로써 dt_modified가 현재 날짜가 된다.
    print('실행 완료')

그런데 이 함수를 실행하려면 장고의 기능이 갖추어진 곳에서 실행해야 한다.
이를 위해 터미널에서 django shell을 켠 다음 실행하도록 한다.
(아마 flask 처럼 context를 이용하는 기능이 있긴 할 것이다.)

(django-envs) ☁  costory [master] ⚡  python manage.py shell                  
Python 3.7.7 (default, May 17 2021, 22:08:58) 
[Clang 11.0.3 (clang-1103.0.32.62)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

>>> from posts.validate_data import validate_post
>>> validate_post()
실행 완료
profile
쿄쿄
post-custom-banner

0개의 댓글