09.-2 더미 데이터 생성

조재훈·2022년 7월 22일
0

Clone_Airbnb

목록 보기
19/31
post-thumbnail

1) seed_amenities

rooms - management - commands - seed_amenities.py

from django.core.management.base import BaseCommand
from rooms import models as models_room

clas Command(BaseCommand):
    
    def handle(self, *args, **options):
        amenities = [
            "Air conditioning",
            "Alarm Clock",
            "Balcony",
            "Bathroom",
            "Bathtub",
            "Bed Linen",
            "Boating",
            "Cable TV",
            "Carbon monoxide detectors",
            "Chairs",
            "Children Area",
            "Coffee Maker in Room",
            "Cooking hob",
            "Cookware & Kitchen Utensils",
            "Dishwasher",
            "Double bed",
            "En suite bathroom",
            "Free Parking",
            "Free Wireless Internet",
            "Freezer",
            "Fridge / Freezer",
            "Golf",
            "Hair Dryer",
            "Heating",
            "Hot tub",
            "Indoor Pool",
            "Ironing Board",
            "Microwave",
            "Outdoor Pool",
            "Outdoor Tennis",
            "Oven",
            "Queen size bed",
            "Restaurant",
            "Shopping Mall",
            "Shower",
            "Smoke detectors",
            "Sofa",
            "Stereo",
            "Swimming pool",
            "Toilet",
            "Towels",
            "TV",
        ]
        for a in amenities:
            models_room.Amenity.objects.create(name=a)
        self.stdout.write(self.style.SUCCESS("Amenities created!"))

콘솔에 실행해보자

python manage.py seed_amenities


짠. Amenities가 잘 생성되었다.

참고로 저기서 Amenity.objects.create() 할 때 create는 dir(Amenity.objects)를 해보면 나오는데, 이것에 대한 정보는 여기서 얻을 수 있다. 아래의 create를 포함해서 dir(Amenity.objects)로 검색시 나오는 모든 메소드들에 대한 정보가 담겨있다.
참고로 create() 메소드는 QuerySets을 반환하지 않는 메소드라고 한다. 캐쉬를 사용하지 않는 대신 호출될 떄 마다 DB를 쿼리한다고 한다. (쿼리한다는게 정확히 뭔지는 아직 모르겠다. 사전에 검색해보니 문의하다, 질문하다 인데 데이터를 요청한다는 말인가?)

https://docs.djangoproject.com/en/4.0/ref/models/querysets/#create
https://masteringdjango.com/django-tutorials/mastering-django-advanced-models/

쿼리셋 구성방법
https://docs.djangoproject.com/en/4.0/topics/db/queries/
https://django.readthedocs.io/en/stable/topics/db/queries.html

이건 읽어보고 해당 없으면 지우기
https://docs.djangoproject.com/en/4.0/topics/db/managers/

2) seed_facilities

동일한 폴더에 seed_facilities를 작성한다.
rooms - management - commands - seed_facilities.py

from django.core.management.base import BaseCommand
from rooms import models as models_room

class Command(BaseCommand):
    
    help = "This command creates facilities"
    
    def handle(self, *args, **options):
        facilities = [
            "Private entrance",
            "Paid parking on premises",
            "Paid parking off premises",
            "Elevator",
            "Parking",
            "Gym",
        ]
        for f in facilities:
            models_room.Facility.objects.create(name=f)
        self.stdout.write(self.style.SUCCESS("Facilities created!"))

실행

python manage.py seed_facilities


3) Django-seed

django-seed는 가짜 데이터를 생성해준다. CharField에는 짧은 글, TextField에는 긴 글, IntegerField에는 숫자 등을 자동으로 추가해준다.
https://github.com/Brobin/django-seed
설치하자

pipenv install django-seed

설치가 끝났으면 settings.py에 들어가서 INSTALLED_APPS에 추가해준다. 우리의 경우는 이를 3개로 쪼개놓았으므로 그 중 THIRD_PARTY_APPS에 추가해준다.
config - settings.py

THIRD_PARTY_APPS = [
    "django_seed",
]

이제 room과 user를 어마어마하게 만들어볼 것이다.

4) seed_users

아까 했던것과 마찬가지로 users에도 자작 명령어를 만들 것이다. management 폴더를 만들고 그 안에 __init.py와 commands 폴더, commands 폴더 안에 __init.py와 seed_users.py 파일을 만든다.

아래의 가이드를 활용하여 handle()을 구현한다.

근데 그 전에 User들은 권한의 차이가 존재한다. superuser나 staff 등....

우리는 staff와 superuser는 만들지 않을 것이다.
users - management - commands - seed_users

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

class Command(BaseCommand):

    help = "This command creates many users"
    
    def add_arguments(self, parser):
        parser.add_argument(
            "--number",
            default=2,
            help="How many users do you want to create?",
        )
    
    def handle(self, *args, **options):
        number = options.get("number")
        seeder = Seed.seeder()
        seeder.add_entity(
            models_user.User,
            number,
            {
            	"is_staff" : False,
                "is_superuser" : False,
            },
        )
        seeder.execute()
        self.stdout.write(self.style.SUCCESS(f"{number} users created!"))

add_arguments는 유사하게 작성하되, number에 대한 기본값으로 2를 지정한다.
handle()에서는 우선 생성할 갯수를 지정해야한다. 우리가 'number'를 parser로 등록해놓았기 때문에 options에서 검색이 된다.
그리고 추가할 user는 superuser도 아니고 staff도 아니어야 하므로 이 옵션을 추가해줘야 한다.
User가 상속받은 AbstractUser를 보면 is_staff 가 BooleanField로 정의되어있다. 이 값을 가져와 False로 해주자.

그리고 AbstractUser가 상속받은 PermissionMixin을 보면 is_superuser가 BooleanField로 정의되어있다. 이것 또한 가져와서 False로 해주자.

실행해보자.

python manage.py seed_users --number 2

psycopg2 라는게 없다고 한다. 흠....
뭔진 모르겠는데 일단 설치해주자.

pipenv install psycopg2


계속 안되길래 psycopg2-binary도 설치해봤다.

그래도 안된다 ㅡ.ㅡ.....

댓글을 보니 누가 django_seed를 0.2.2 버전으로 깔면 된다고 한다.

안되는데?
근데 자세히보니 에러 메시지가 약간 바뀌었다.

for i in range(0, number)
TypeError: 'str' object cannot be interpreted as an integer

아!!!! 저 number가 integer가 아니라 string으로 되어있구나!!!

users - management - commands - seed_users.py - Command - handle

        seeder.add_entity(
            models_user.User,
            int(number),
            {
                "is_staff": False,
                "is_superuser": False,
            }
        )


오호호호호호호

문제를 해결했으니 이제 django-seed를 최신버전으로 바꿔보련다. 역시 잘 된다.
생성된 유저도 우리가 의도한대로 staff와 superuser가 모두 해제되어있다.

알고보니 인강에서도 동일한 오류가 뒤쪽에서 발생해서 그 해결법대로 해줬다. 그 편이 더 깔끔한 듯 하다.
users - management - commands - seed_users.py - Command - add_arguments

        parser.add_argument(
            "--number",
            default=2,
            type=int,
            ~~

type=int로 지정해줬다. 그리고 handle에서 int로 감쌌던건 삭제.

잘 된다.

50명을 더 생성해주자.

profile
맨땅에 헤딩. 인생은 실전.

0개의 댓글