django models.py에서 모델링을 작성할 때, 클래스(테이블) 간의 관계 설정은 가장 자주 접하는 일이면서도 중요한 부분이다.
대표적으로 OnetoOne
, ManytoOne
, ManytoMany
관계가 있고 이 과정에선 ForeignKey
설정이 필요한데 2가지 옵션에 대해 정리하고자 한다.
ForeignKey (to, on_delete, **options)
django 모델링에서 ForeignKey
를 설정할 때, 필수로 받아야 하는 인자는 아래와 같다.
공식문서를 보면, 아래와 같은 모델링 예시가 나온다.
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
클래스 Car
의 manufacturer
필드를 보면,
'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,
)
# ...
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