본문 바로가기

PYTHON

[TIL] 20240425 51일차

Python Django 심화 강의 중

 

python manage.py seed articles --number=20 --seeder "Comment.article_id" 2

 

해당 명령어를 cmd에서 사용해야 하는 상황이 있다.

 

https://github.com/Brobin/django-seed

 

GitHub - Brobin/django-seed: :seedling: Seed your Django database with fake data

:seedling: Seed your Django database with fake data - Brobin/django-seed

github.com

해당 명령어는 django-seed README 를 보면 확인할 수 있다.

 

특정 모델(Table)의 column을 지정해서 랜덤 데이터를 생성하고 싶을 때 위 명령어를 사용한다.

 

아래는 models.py 에 작성한 코드 중 Comment 클래스 부분이다.

class Comment(models.Model):
    article = models.ForeignKey(
        Article, on_delete=models.CASCADE, related_name="comments"    
    )
    content = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

Comment 모델의 article은 ForeignKey 인스턴스이다.

즉 Comment 테이블에서 article은 FK 필드이다.

 

위에서 "Comment.article_id" 2 라고 작성한 것의 의미는, 저 FK가 참조하고 있는 Table의 id가 2라는 뜻이다.

 


[문제 상황]

 

그럼 만약 models.py 에서 Comment 클래스를 작성할 때, FK 필드 명을 article이 아닌 title로 잘못 작성하면 어떻게 될까?

class Comment(models.Model):
    title = models.ForeignKey(
        Article, on_delete=models.CASCADE, related_name="comments"    
    )
    content = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)​

 

 

python manage.py seed articles --number=20 --seeder "Comment.article_id" 2

 

위의 django seed 명령어를 사용할 수 없는 것인가? 그렇지는 않다.

물론 위 명령어를 그대로 사용하면 error가 발생한다. article_id 라는 필드명은 존재하지 않는다는 오류가 발생한다.

(KeyError: 'article_id')

 

그래도 당장에 문제 상황 속에서 저 명령어 만을 수정해서 해결할 수 있나? 라고 하면 그렇다.

python manage.py seed articles --number=20 --seeder "Comment.title_id" 2

 

"Comment.article_id" 를 "Comment.title_id" 라고 수정하면 된다. FK 필드명이 title 이기 때문이다.

 

 

하지만 FK 필드명을 작성하는 과정에서 실수를 한 것이기 때문에, FK 필드명을 수정하는 방식을 택하고 싶다.

그렇다면 어떻게 해결해나가면 될까?

 

 

class Comment(models.Model):
    #title = models.ForeignKey(
    #    Article, on_delete=models.CASCADE, related_name="comments"    
    #)
    article = models.ForeignKey(
        Article, on_delete=models.CASCADE, related_name="comments"    
    )
    content = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)​

 

FK 필드명을 article로 수정한 뒤

model의 필드명이 수정된 것이므로, 마이그레이션(migration)이 필요하다.

 

따라서 cmd로 마이그레이션을 생성하고(python manage.py makemigrations)

해당 마이그레이션을 적용한다(python manage.py migrate)

 

마이그레이션을 생성하는 과정에서 FK의 필드명 수정 건이 있는데 이를 적용하겠냐는 알림 문구가 출력된다. y를 입력하면 된다.

 

이렇게 마이그레이션을 마치고 나서 위의 django seed 명령어를 수행하면 정상적으로 동작함을 확인할 수 있다.

'PYTHON' 카테고리의 다른 글

20240422 ~ 20240426 10주차 정리  (0) 2024.04.26
[TIL] 20240424 50일차  (0) 2024.04.24
[TIL] 20240423 49일차  (0) 2024.04.23
[TIL] 20240422 48일차  (0) 2024.04.22
20240408 ~ 20240412 9주차 정리  (0) 2024.04.12