[django] Foreignkey 관계 설정의 2가지 option

EMMA·2022년 7월 20일
0

모델링의 꽃, 관계 설정

django models.py에서 모델링을 작성할 때, 클래스(테이블) 간의 관계 설정은 가장 자주 접하는 일이면서도 중요한 부분이다.

대표적으로 OnetoOne, ManytoOne, ManytoMany 관계가 있고 이 과정에선 ForeignKey 설정이 필요한데 2가지 옵션에 대해 정리하고자 한다.



ForeignKey

ForeignKey (to, on_delete, **options)

django 모델링에서 ForeignKey를 설정할 때, 필수로 받아야 하는 인자는 아래와 같다.

  • to: 다대일 관계에 놓일 클래스
  • on_delete: SQL constraint 관련 설정 - 잘못된 데이터 입력을 막기 위해 제약조건을 두는 것을 말한다

관계 설정 시 겪는 2가지 상황

공식문서를 보면, 아래와 같은 모델링 예시가 나온다.

from django.db import models

class Car(models.Model):	
	#car - manufacturer는 N:1 관계, manufacturer를 FK로 설정한다 
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass

클래스 Carmanufacturer 필드를 보면,

  • FK로 설정되어 있으며
  • 'Manufacturer' 라고 따옴표로 감싼 모델명을 표기했다

어떤 경우에 따옴표(혹은 쌍따옴표)를 사용하는 것일까?

"If you need to create a relationship on a model that has not yet been defined, you can use the name of the model, rather than the model object itself" (django 공식문서)

다시 위 예시를 보자.

클래스 Car에서 먼저 클래스 Manufacturer를 FK로 설정했으나, 위에서 아래로 읽어 내려가는 python/django 특성 상 Manufacturer는 정의되어 있지 않다. 그래서 공식문서에서 설명한 대로 클래스 이름(str 형태)을 저장한 것이다.

때문에 만약 아래와 같이 작성하면 오류가 뜬다.

from django.db import models

class Car(models.Model):	
    manufacturer = models.ForeignKey(
    	#위 예시와 달리, 아직 정의되지 않았음에도 객체 그대로 갖고옴
        #error - unresolved reference 
        Manufacturer,
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass

객체 그대로 사용하기 위해서는, 아래와 같이 작성되어야 한다.

from django.db import models

class Manufacturer(models.Model):
    # ...
    pass
    
class Car(models.Model):	
    manufacturer = models.ForeignKey(
    	#Manufacturer가 위에 정의되었기 때문에, 객체 그대로 갖고옴
        Manufacturer,
        on_delete=models.CASCADE,
    )
    # ...


결론: 2가지 option

FK 관계에 놓일 클래스를 설정할 때, 결국 2가지 option으로 정리할 수 있다.

  • 클래스명(str형태)로 작성한다면, 각 클래스가 정의된 순서를 따질 필요가 없다
  • 객체 그대로 작성한다면, 각 클래스가 정의된 순서를 따져야 한다


참고 자료
https://docs.djangoproject.com/en/4.0/ref/models/fields/#django.db.models.ForeignKey
https://hoorooroob.tistory.com/entry/%ED%95%B4%EC%84%A4%EA%B3%BC-%ED%95%A8%EA%BB%98-%EC%9D%BD%EB%8A%94-Django-%EB%AC%B8%EC%84%9C-Models-%EB%8B%A4-%EB%8C%80-%EC%9D%BC-%EA%B4%80%EA%B3%84

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글