본문 바로가기
Coding/Python

Django 외래키(Foreign key) 생성 방법/관련 이슈

by Hide­ 2018. 2. 5.
반응형

장고로 데이터베이스 테이블을 생성하던 중 몇가지 이슈를 발견했다.

먼저 테이블 생성을 하려면 models.py 파일에 class로 선언해줘야 한다.

(데이터베이스는 MySQL을 사용함)


class user(models.Model):

userkey = models.CharField(primary_key=True, max_length=20)

username = models.CharField(max_length=30)


class article(models.Model):

articleNo = models.IntegerField(primary_key=True)

userkey = models.ForeignKey('user', on_delete=models.CASCADE, db_column='userkey')

content = models.CharField(max_length=500)

likeCount = models.IntegerField()

commentCount = models.IntegerField()

date = models.DateTimeField(auto_now_add=True)


class comment(models.Model):

articleNo = models.ForeignKey('article', on_delete=models.CASCADE)

content = models.CharField(max_length=500)

userkey = models.ForeignKey('user', on_delete=models.CASCADE)

date = models.DateTimeField(auto_now_add=True)


class like(models.Model):

articleNo = models.ForeignKey('article', on_delete=models.CASCADE)

userkey = models.ForeignKey('user', on_delete=models.CASCADE)


현재 만들고 있는 시스템 중 하나에서 사용할 테이블 구조들이다.

Foreign Key를 통해 여러개를 연결시켜줬다.

위 소스를 보면 알겠지만 장고에서 외래키를 선언할 때는


컬럼명 = models.ForeignKey('참조할 클래스명', 옵션)


이렇게 주면 된다.

근데 처음에는 참조할 컬럼명을 명시해주지 않아서 뭔가 싶었는데 어차피 테이블에서

Primary key는 하나니까 그냥 클래스명만 주면 알아서 해당 클래스에서 선언한 Primary Key를 참조시키는 것 같다.

튼, 저렇게 하고 migrate시키면 예상과는 조금 다른 결과가 나온다.


이런식으로 기본컬럼명_id라고 붙어버리는 것이다.

이건 장고 공식문서에 나와있는 바로는 원래 저렇게 나오는거라고 한다.

근데 난 저런 이름 대신 내가 원래 지정했던 컬럼명을 사용하고 싶다.

그럴때는 옵션으로 db_column='컬럼명' 이렇게 해주면 된다.

예를 들어 아래와 같은 라인이 있다고 생각해보자.


userkey = models.ForeignKey('user', on_delete=models.CASCADE)


이렇게 하고 생성해버리면 userkey컬럼이 아닌 userkey_id라는 컬럼이 생성된다.

따라서 아래와 같이 해줘야 한다.


userkey = models.ForeignKey('user', on_delete=models.CASCADE, db_column='userkey')


아, 그리고 desc 테이블명 해서 테이블 명세를 살펴보면 Key 부분에 MUL이라고 나오는데

원래 외부키 설정하면 MUL이라고 나오는 것 같음.