Django

commands - 샘플 커스텀 명령어 만들기

kinggoddino 2024. 9. 25.

django-seed 좋다고 생각했는데 하다보니까

의미없는 데이터만 만들어줘서

테스트가 제대로 되질 않는다.

 

그래서 샘플 데이터 생성 명령어를 만들어봤다

 

articles / management / commands / seed_articles.py

from django.core.management.base import BaseCommand
from django_seed import Seed
from articles.models import Article, Category, Comment, ArticleLike, CommentLike
from django.contrib.auth import get_user_model
import random
from datetime import timedelta
from django.utils import timezone

User = get_user_model()


class Command(BaseCommand):

    def handle(self, *args, **kwargs):
        seeder = Seed.seeder()

        # 유저: 10명 생성!
        seeder.add_entity(
            User,
            10,
            {
                "user_id": lambda x: seeder.faker.user_name(),
                "email": lambda x: seeder.faker.email(),
                "password": lambda x: seeder.faker.password(),
                "nickname": lambda x: seeder.faker.first_name(),
            },
        )

        # 카테고리: News, Ask, Show 고정
        category_names = ["News", "Ask", "Show"]
        for name in category_names:
            Category.objects.get_or_create(name=name)

        users = User.objects.all()[:10]

        # Article: 총 50개 생성!
        seeder.add_entity(
            Article,
            50,
            {
                "title": lambda x: seeder.faker.sentence(),
                "content": lambda x: seeder.faker.text(),
                "category": lambda x: Category.objects.get(
                    name=random.choice(category_names)
                ),
                "author": lambda x: random.choice(users),
                # 날짜: 최근 일주일 중 하루
                "created_at": lambda x: timezone.now()
                - timedelta(days=random.randint(0, 6)),
            },
        )

        # Comment: 총 150개 (댓글, 대댓글)
        seeder.add_entity(
            Comment,
            150,
            {
                "article": lambda x: random.choice(Article.objects.all()),
                "content": lambda x: seeder.faker.text(),
                "author": lambda x: random.choice(users),
                "parent": lambda x: random.choice(
                    [None] + list(Comment.objects.filter(parent=None))
                ),
            },
        )

        # 게시글 좋아요: 총 200개
        seeder.add_entity(
            ArticleLike,
            200,
            {
                "article": lambda x: random.choice(Article.objects.all()),
                "user": lambda x: random.choice(users),
            },
        )
        # 댓글 좋아요: 총 500개
        seeder.add_entity(
            CommentLike,
            500,
            {
                "comment": lambda x: random.choice(Comment.objects.all()),
                "user": lambda x: random.choice(users),
            },
        )

        seeder.execute()

        print("\n\n" + "-" * 50)
        print(self.style.SUCCESS("방금 뜬 WARNING은 장고 기본 테이블 때문이니까 신경쓰지 마세요!!!!\n"))
        print(self.style.SUCCESS("유저 10, 게시글 50, 댓글 150, 글좋아요 200, 댓글좋아요 500 생성 성공!!\n"))

        # 생성된 유저들의 nickname 출력하기 (쓸거같음)
        created_users = User.objects.all()[:10]
        nicknames = [user.nickname for user in created_users]
        self.stdout.write(self.style.SUCCESS(f"닉네임 10개: {', '.join(nicknames)}"))

팀원들이 WARNING 보고 놀랄까봐 메시지도 적어줘씀

 

 

1. 현재 데이터베이스 날리기

python manage.py flush

 

2. 마이그레이트 하기

python manage.py migrate

 

3. 데이터 생성하기

python manage.py seed_articles

 

 

 


 

'Django' 카테고리의 다른 글

[Django] 시험 오답노트  (1) 2024.09.02
[Django] #11 장고 Model  (0) 2024.08.16
[Django] #10 다중앱과 URL  (0) 2024.08.15
[Django] #9 HTTP Form  (0) 2024.08.15
[Django] #8 장고 Template System  (0) 2024.08.14