본문 바로가기

Django

Django seed로 테스트 데이터 자동 생성

해당 내용 참고 하기전 먼저 보고와야할 내용이 있다. 알고 있다면 계속해서 참고하자.

django로 개발시 테스트 데이터가 필요한 경우 손수 하나씩 넣는건 비효율적이다.

그래서 사용하는것이 django-seed이다.

django-seed 모듈을 통해 필드에 맞는 데이터를 직접 알맞게 셋팅 가능하다.

install

$ pip install django-seed

설정

# settings.py
INSTALLED_APPS = [
      'django_seed',
]

위의 작업을 마치면 django-seed를 사용할 준비는 끝났다.

그럼 사용 방법을 예제로 알아보자

User 테이블에 데이터를 10개 정도 만들어보자

키워드는 seeder.add_entity(User, 10) 이다. add_entity()안에 model 테이블을 넣고 다음에 생성할 데이터의 수를 입력하면 된다.

from django.core.management.base import BaseCommand
from django_seed import Seed
from users.models import User

class Command(BaseCommand):
      def handle(self, *args, **options):
          user_seeder = Seed.seeder()
        user_seeder.add_entity(User, 10)
        user_seeder.execute()  # 실행하는 명령어

이렇게 작성하고 실행방법은 python manage.py test_data 이다. test_data는 위의 소스 코드 파일 이름이다. 파일이름은 본인 마음대로 지정해도 된다.

그리고 admin사이트나 shell에서 User 테이블 쿼리해보면 잘 생성 되었는지 확인 가능하다.

스크린샷 2021-06-30 오후 2 23 33

admin 페이지에서 확인해봤을때 이렇게 나온다.

그럼 조금 더 나아가 의문이 생기기 마련이다. 이렇게 데이터가 생기는건 좋아 그런데 값을 내 마음대로 정하는건 안되나?

당연히 된다. add_entity()에 기존에 넣었던 인자뒤에 하나 더 추가 해주면 된다.

형식은 dict형태이고 해당 테이블의 속성 값을 key에 본인이 설정하고 싶은 값을 value에 넣어주면 데이터 커스텀이 가능하다.

# 위의 코드를 가져와 코드 몇줄을 추가 하면서 알아본다.
import random
from django.core.management.base import BaseCommand
from django_seed import Seed
from users.models import User

class Command(BaseCommand):
      def handle(self, *args, **options):
          phone = (lambda x: random.randint(00000000, 99999999))(0)
          user_seeder = Seed.seeder()
        user_seeder.add_entity(User, 10, {
              'phone': f'010{phone}',
              'is_active': True,
              'is_admin': False
        })
        user_seeder.execute()  # 실행하는 명령어

외래키로 연결된 데이터 생성

프로젝트를 하면서 DB까리 서로 묶이는 경우는 흔하다. 그런데 이러한 상황에서 서로 연결되어야 하는 값들을 그냥 데이터 세팅만 해준다면 테스트를 하더라도 아무 소용없는 짓일게 뻔하다.

그래서 이번엔 외래키로 연결된 데이터 생성을 해보려고한다. 위의 코드와 연결되는 내용이니 참고 하자.

# 위의 코드를 가져와 코드 몇줄을 추가 하면서 알아본다.
import os
import random
from django.core.management.base import BaseCommand
from django_seed import Seed
from users.models import User

class Command(BaseCommand):
      def handle(self, *args, **options):
          phone = (lambda x: random.randint(00000000, 99999999))(0)
          user_seeder = Seed.seeder()
        user_seeder.add_entity(User, 10, {
              'phone': f'010{phone}',
              'is_active': True,
              'is_admin': False
        })
        user_seeder.execute()  # 실행하는 명령어

        user = User.objects.all()  # shell이나 admin에서 user 데이터 생성 확인하고 진행하기
        path = 'core/test_image'  # 내 프로젝트에 테스트 이미지가 담겨 있는 경로이다.(이 경로가 같다면 쓰지만 아니라면 본인 경로를 쓴다.)
        post_seeder = Seed.seeder()
        post_seeder.add_entity(Post, 50, {
              'user': lambda x: random.choice(user),  # random.choice는 아무 원소나 하나 뽑아준다.(아무 user 하나 뽑아서 채워준다.)
              'photo': lambda x: random.choice(os.listdir(path)),  # 경로안에 이미지를 랜덤하게 가져온다.
              'content': lambda x: post_seeder.faker.sentence()  # 임의의 설명을 채워준다.
        }
        )
        post_seeder.execute()

        self.stdout.write(self.style.SUCCESS('data create success!'))

'Django' 카테고리의 다른 글

django FBV(함수형 뷰)에 대해서  (0) 2021.08.03
django API 문서 설정 (drf-yasg)  (0) 2021.08.03
Django management command 사용하기  (0) 2021.06.30
Django User model Custom  (0) 2021.06.29
DRF ModelSerializer  (0) 2021.06.19