본문 바로가기
아카이브

Django 개발 시 테스트를 위한 fake 데이터 생성하기(Django-seed)

by PilYeooong 2020. 3. 10.


Django를 이용하여 개발 시 테스트를 위해 모델에 대한 객체(object) 혹은 데이터를 생성하여 사용을 합니다.


위 이미지처럼 어드민 패널이나 Shell을 통해서도 생성 할 수 있습니다.
하지만 수작업으로 하기에 조금 많은 양을(100-200개) 다뤄야 할 상황도 충분히 있을겁니다.
이러한 번거로운 과정을 해결해줄 수 있는 'django-seed' 에 대해 간단하게 정리해보고자 합니다.

 


 

첫번째로 패키지를 설치한 후

pip install django-seed


settings.pyINSTALLED_APPS 'django_seed'를 추가하여 줍니다.

그 후에 가짜 데이터(fake data)를 생성할 app 폴더를 다음과 같이 구성합니다.
저는 기존 작업중이던 뷰스타그램의 users app 폴더로 진행하였습니다 !

폴더 구조


기본 app 폴더 구조에 management/commands/seed_users.py로 구성하였습니다.
여기서 management 폴더에 __init__.py를 추가하여 Django에서 인식할 수 있도록 합니다. (필수)


디렉토리 구성 후, management 시스템으로 이용할 수 있는 명령어들을 둘러봅시다

python manage.py --help


migrate, runserver ... 등등 자주 쓰는 명령어와 함께 제일 밑에 아까 등록한 seed_users도 존재하고 있습니다.



디렉토리를 구성하는 것만으로 django management 시스템에 명령어를 등록하였습니다.
당연히 실행은 되지 않겠죠?!

https://docs.djangoproject.com/en/3.0/howto/custom-management-commands/

 


 

명령어는 성공적으로 등록하였고.. 이제 코드 작성입니다

from django_seed import Seed

from django.core.management.base import BaseCommand


class Command(BaseCommand):

    help = 'This command creates users'

    def add_arguments(self, parser):
        parser.add_argument(
            '--number', default=1, type=int, help="How many users do you want to create?"
        )


seed_users 명령어에 관한 argument를 작성하여 줍니다. 옵션이라 이해하셔도 무방합니다 !

 

그리고나서는 명령어가 실행되면, 실질적으로 명령어의 대한 동작을 담당할 handle의 로직을 구성하여야 합니다.

from django_seed import Seed

from django.core.management.base import BaseCommand

from users.models import User


class Command(BaseCommand):

    help = 'This command creates users'

    def add_arguments(self, parser):
        parser.add_argument(
            '--number', default=1, type=int, help="How many users do you want to create?"
        )

    def handle(self, *args, **options):
        number = options.get('number')
        seeder = Seed.seeder()
        seeder.add_entity(User, number)
        seeder.execute()
        self.stdout.write(self.style.SUCCESS(f'{number} users created!'))



코드를 작성하였고, 실행시키기 전에 !


현재 User의 상황은 이러합니다.
admin만 존재하고 있습니다.


이제 명령어를 실행해보면..


아주 잘 동작하고 있습니다

 

 

'cholmes' 라는 username을 가진 User가 생성되었네요

여기서 아까 코드에서 작성한 옵션을 활용하면, 한번에 원하는 만큼의 User를 생성할 수도 있습니다.

 

 

 

순식간에 화면 하나에 못담을 정도로 많이 만들어 버렸네요 !
정말 편합니다 !


여기서 User를 생성하는 조건 또한 부여 할 수 있습니다.
예시로 superuser와 staff의 권한이 없는 유저만 생성하도록 코드를 작성해보겠습니다.

from django_seed import Seed

from django.core.management.base import BaseCommand

from users.models import User


class Command(BaseCommand):

    help = 'This command creates users'

    def add_arguments(self, parser):
        parser.add_argument(
            '--number', default=1, type=int, help="How many users do you want to create?"
        )

    def handle(self, *args, **options):
        number = options.get('number')
        seeder = Seed.seeder()
        seeder.add_entity(User, number, {
            'is_staff': False,
            'is_superuser': False,
        })
        seeder.execute()
        self.stdout.write(self.style.SUCCESS(f'{number} users created!'))

 

add_entity() 부분에 제약사항을 추가함으로써 staff와 superuser의 권한을 갖지 않는 User만 생성하도록 하였습니다.

기존 생성했던 User들을 지우고 다시 코드를 실행하고 확인해보면..

아까처럼 랜덤으로 부여되었던 staff, superuser의 권한이 모두 통일되게 False로 되어 있습니다.




간단하게 사용하여 보았는데, User 모델보다 좀 더 복잡한 관계를 가진 모델에도 적용 가능합니다. 나중에 한번 다뤄볼께요 !

감사합니다

https://github.com/mstdokumaci/django-seed을 참고하였습니다.

'아카이브' 카테고리의 다른 글

Django Pagination - 페이지네이션  (0) 2020.03.13
200310 / TIL  (0) 2020.03.11
200309 / TIL  (0) 2020.03.09
200306 / TIL  (0) 2020.03.06
200305 / TIL  (0) 2020.03.05