django seed – 모델에 맞는 다양한 형태의 테스트 데이터 생성

테스트를 위해 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-seedSeed 클래스는 현재 로케일을 지정하는 기능을 제공하지 않으므로, 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)

django-seed · PyPI

Localized Providers — Faker 24.11.0 documentation

Leave a Comment

목차