테스트를 위해 Django 데이터베이스를 수동으로 채우다 보면 꽤나 시간을 잡아먹게 됩니다. 이때 사용할 수 있는 게 Django Seed 입니다.
Django Seed는 Django 데이터베이스에 초기 또는 테스트 데이터를 빠르고 쉽게 채울 수 있는 Python 패키지입니다.
지정한 모델을 기반으로 임의의 데이터를 생성하므로 개발, 테스트는 물론 생산 설정에도 아주 이상적이죠…!!
django seed 설치 및 설정
pip install django-seed
ModuleNotFoundError
발생시
ModuleNotFoundError: No module named 'psycopg2'
에러 발생 시pip install psycopg2
설치 -> 에러 뜰 시pip install psycopg2-binary
설치
settings.py에 django_seed를 추가합니다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_seed',
'articles',
]
시더 생성 방법1. 커맨드를 사용
아래 명령어면 시드 데이터 (혹은 “테스트 데이터”, “더미 데이터”) 생성이 완료됩니다..!
python manage.py seed model_name --number number_of_data
특정 필드에는 정해진 값을 넣어주고 싶은 경우
python manage.py seed --number=15 --seeder "MyModel.my_field" "1.1.1.1"
시더 생성 방법2. 코드를 사용
django-seed는 Django 모델에 대한 테스트 데이터베이스를 쉽게 시드하는 방법을 제공합니다.
코드로 실행하기 위해서는 우선 새 디렉토리 구조를 만들어줘야 합니다.
app 하위에 management>commands 디렉토리를 생성합니다.
mangement 디렉토리 하위에 __init__.py
를 생성합니다
commands 디렉토리 하위에 seed 코드를 입력할 모듈을 생성합니다.
이렇게 디렉토리 구조와 파일을 생성하고 python manage.py를 입력하면 아래와 같이 우리가 생성한 seeds.py 파일명과 동일한 이름으로 subcommand가 생성되는 것을 알 수 있습니다.
이제 커맨드가 어떻게 동작할지 seeds.py에 입력해주면 됩니다.
BaseCommand
을 상속 받아 Command 클래스를 만들어 줍니다.
모델 인스턴스로 데이터베이스를 시드하려면 Seed.seeder()
로 시더 인스턴스를 가져온 다음 add_entity()
메서드를 사용하면 됩니다.
add_arguments
는 인자로 받을 것들을 입력해줍니다.
명령어의 대한 동작은 handle
함수로 구현합니다.
self.stdout.write
를 하면 콘솔에 출력이 되고, self.style.SUCCESS
를 적어주면 초록색 글씨로 출력 됩니다.
from django_seed import Seed
from django.core.management.base import BaseCommand
from ...models import Articles
class Command(BaseCommand):
help = 'This command creates articles'
def add_arguments(self, parser):
parser.add_argument(
'--number', default=1, type=int, help="How many articles do you want to create?"
)
def handle(self, *args, **options):
number = options.get('number')
seeder = Seed.seeder()
seeder.add_entity(Articles, number)
seeder.execute()
self.stdout.write(self.style.SUCCESS(f'{number} users created!'))
이제 python manage.py seeds
로 데이터를 생성할 수 있습니다.
코드 실행 전
코드 실행 후
레코드가 추가된 것을 확인 할 수 있습니다.
특정 필드에 정해진 값을 넣어주고 싶은 경우
seeder는 이름과 칼럼 유형을 사용하여 모델에 관련 데이터를 채웁니다.
하지만 특정 필드에는 특정 값을 채워 넣고 싶을 때가 있을 수 있고요.
자동으로 칼럼명과 칼럼 유형을 사용하여 데이터를 채우지만 이를 잘못 해석해서 AttributeError(field)
가 발생할 수 있습니다.
이 경우에는 add_entity()
메서드에 세 번째 인자를 추가하여 특정 열을 채우는 데 사용할 사용자 정의 함수를 지정할 수 있습니다.
seeder.add_entity(Player, 10, {
'score': lambda x: random.randint(0, 1000),
'nickname': lambda x: seeder.faker.email(),
})
seeder.execute()
시더의 언어 변경
django-seed
를 사용하여 한글 데이터를 생성하려면 Faker
라이브러리의 로케일을 한국어(ko_KR
)로 설정해야 합니다.
하지만 django-seed
의 Seed
클래스는 현재 로케일을 지정하는 기능을 제공하지 않으므로, Faker
객체를 직접 생성하여 한글 데이터를 생성할 수 있습니다.
faker = Faker(locale=["ja_JP"])
- 언어를 일본어로 설정합니다
title = faker.sentence()
- faker 인스턴스를 통해서 문장을 생성해줍니다.
Articles.objects.create(title=title, content=content)
- 생성한 데이터를 ORM을 통해서 넣어줍니다.
from django_seed import Seed
from django.core.management.base import BaseCommand
from ...models import Articles
from faker import Faker
class Command(BaseCommand):
help = 'This command creates articles'
def add_arguments(self, parser):
parser.add_argument(
'--number', default=1, type=int,
help="How many articles do you want to create?")
def handle(self, *args, **options):
number = options.get('number')
faker = Faker(locale=["ja_JP"])
for _ in range(number):
title = faker.sentence()
content = faker.paragraph()
# Create Article instance with Korean data
Articles.objects.create(title=title, content=content)
self.stdout.write(self.style.SUCCESS(f'{number} articles created!'))
명령어를 실행해서 일본어 데이터가 정상적으로 생성되는지 테스트 해봅니다.
python manage.py seeds
DB에 가면 일본어 데이터가 생성된 것을 확인 할 수 있습니다.
마치며
이상하게 다른 언어는 되는데 한글은 생성이 안되네요…
이 문제는 추가로 공부해봐야 할 것 같습니다.
참고하면 좋은 글
Psycopg will not work – Using Django / Mystery Errors – Django Forum (djangoproject.com)