[Django] migration 오류 날 경우 shell로 데이터 넣기

뚜니어리·2023년 12월 11일
0

Django

목록 보기
2/3
post-thumbnail

장고에서 마이그레이션과 마이그레이트를 하면 일반적으로 데이터가 동기화가 되어야한다...

python manage.py makemigrations
python manage.py migrate

이렇게 해도 안 될 경우..

python manage.py makemigrations users
python manage.py makemigrations tasks

폴더별로 마이그레이션을 해주면 저번엔 되었었는데 이번엔 안된다..
다시 해도 안된다..


앱 구조를 잘못짰나?..
그래서 일단 급한 마음에.. 쿼리로 들어가서 확인을 해보았다..

python manage.py shell
>>> from tasks.models import Task
>>> from tasks.models import SubTask
>>> from tasks.models import Team
>>> from users.models import User
>>> Team.objects.all()
<QuerySet []>

흠.. 왜 데이터에 아무것도 안들어가있을까..
Team 데이터만 안들어간다..

Team을 나눠서 그런걸까...
그래서 강제로 넣는 시도를 했다..

for team_name in User.TeamChoices.values:
...     Team.objects.get_or_create(name=team_name) -> 여기서 탭하고 작성해야함

그랬더니

(<Team: Team1>, True)
(<Team: Team2>, True)
(<Team: Team3>, True)
(<Team: Team4>, True)
(<Team: Team5>, True)
(<Team: Team6>, True)
(<Team: Team7>, True)

그리고 나서 다시 조회를 해보니까
>>> Team.objects.all()

<QuerySet [<Team: Team1>, <Team: Team2>, <Team: Team3>, <Team: Team4>, <Team: Team5>, <Team: Team6>, <Team: Team7>]>

이번엔 들어갔다...

왜지?


일단 내 앱은 users / tasks 로 나뉘어있다.

users 앱

class User(AbstractBaseUser, PermissionsMixin):
    class TeamChoices(models.TextChoices):
        Team1 = "Team1", "Team1"
        Team2 = "Team2", "Team2"
        Team3 = "Team3", "Team3"
        Team4 = "Team4", "Team4"
        Team5 = "Team5", "Team5"
        Team6 = "Team6", "Team6"
        Team7 = "Team7", "Team7"

    username = models.CharField(max_length=50, unique=True)

    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = []

    team = models.CharField(
        max_length=50,
        choices=TeamChoices.choices,
        default=TeamChoices.Team1,
    )

    objects = CustomUserManager()

    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.username

tasks앱

from django.db import models

from users.models import User


class Team(models.Model):
    name = models.CharField(
        max_length=50,
        choices=User.TeamChoices.choices,
        unique=True,
    )

    def __str__(self):
        return self.name


class Task(models.Model):
    create_user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name="create_user",
    )
    title = models.CharField(max_length=255)
    content = models.TextField()
    is_complete = models.BooleanField(default=False)
    completed_date = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title


class SubTask(models.Model):
    task = models.ForeignKey(
        Task,
        on_delete=models.CASCADE,
        related_name="subtasks",
    )
    team = models.ManyToManyField(
        Team,
        related_name="subtasks_teams",
        blank=True,
    )
    subtask_create_user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name="subtask_create_user",
    )
    sub_title = models.CharField(max_length=255, blank=True, null=True)
    sub_content = models.TextField(blank=True, null=True)

    is_complete = models.BooleanField(default=False)
    completed_date = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        team_names = ", ".join([team.name for team in self.team.all()])
        return f"{self.task.title} - Teams: {team_names}"

모델의 구조를 잘못 짠거일까...
흐음... 이 부분에서 쿼리로 넣는다고 생각하기까지가 좀 오래 걸렸다...

profile
삽질과 저장소의 그 중간

0개의 댓글