내일배움캠프 23일차
[오늘 한일]
- 프로젝트 제출.
- 프로젝트 발표회.
[오늘 배운점]
오늘 발표를 성공적으로 마쳤다.
발표를 하며 배운점들이 많은데 우선 따로 메모해두었다.
오늘은 지난 주말에 궁금해서 오늘 알아본 부분을 하나 적겠다.
<참조필드 이름, 역참조 이름 정하기>
다른 모델을 참조하는 필드를 만드는 ForeignKey, OneToOneField, ManyToManyField.
모델 간에 연결성을 만들어주기 때문에 자주 쓰인다.
과제와 프로젝트를 하며 모호했던 부분이여서 확실하게 알아봤다.
이런 참조필드의 필드 이름은 어떤게 적합할까?
그리고 역참조용인 related_name='임의이름' 속성.
어떤 이름을 지어주는게 가장 적합할까?
자칫 필드와 필드가 연결을 이어준다고 생각해 상대 필드명을 적을수 있다.
하지만, 이런 참조필드에는.
> 기본적으로 참조하는 모델의 인스턴스를 담기때문에 상대 모델이름이 적합하겠다.
Class User:
(중략)
Class Tweet:
user = models.OneToOneField(User, on_delete=models.CASCADE)
예컨대 이런식으로 작성한다면,
만들어 주는 필드에는 User모델의 인스턴스가 담길 것이다.
그러니 필드명으로는 user가 적합하다.
> OneToOneField, ManyToManyField는 역참조 이름을 정하지 않아도 된다고 배웠다.
그런데 그 이유는 두 필드가 역참조 이름을 자동으로 생성하기 때문이다.
Foreignkey역시 역참조 이름을 자동으로 생성한다.
그 역참조 이름이 바로 모델명_set이다.
그럼 역참조를 해보자.
tweet = Tweet.objects.get(id=id)
user = tweet.user
user = User.objects.get(id=id)
tweet = user.tweet
위의 예시를 이용해 역참조를 작성해본 내용이다.
여기서 두가지 포인트를 알수있었다.
- Tweet 모델은 user라는 원투원 필드를 가지고 있다.
- User 모델에는 tweet필드가 없다.
두 역참조는 대등해보이고 스마트하게 보인다.
하지만, 두 역참조는 완전히 같다고 보기 어렵겠다.
상단의 역참조는 Tweet모델이 가진 user라는 연결성 필드를 지칭했다.
이때 이 필드는 내용자체가 연결된 User인스턴스며,
여기서 .(점)을 더 찍어 해당모델 필드값을 가져오는, 즉 역참조를 동작할수 있다.
하단의 역참조는 User모델에서 tweet속성을 불러온다.
이 tweet이 바로 자동생성된 역참조명이다.
그래서 역참조가 제대로 동작한다. 두개가 이런 차이가 있다.
결론, 역참조는 연결성을 가진 필드로도, 역참조 명으로도 할수 있다.
이건 ForeignKey도 똑같다.
ForeignKey는 해당 모델명_set으로 역참조명이 생성되있으니 이걸 쓰면된다.
이렇게 자동생성 될때, 모델 클래스명에서의 대문자를,
모두 소문자로 만들면서 생성된다.
Tweet을 tweet이런식이다. (ForeignKey라면 tweet_set)
마지막으로 그러면, ForeignKey의 related_name은 어떤 이름을 짓는게 좋을까?
related_name은 역참조 이름을 '임의이름'으로 정하겠다는 속성인데,
해당 모델명_set이라는 자동생성명이 직관적이지 않기 때문에 보통 수정을 해주게 된다.
> 즉, 해당 필드를 가진 모델의 모델명이 적합하겠다.
다만, 모델명과 완전 같은 경우 충돌로 인한 에러가 날 가능성이 있다.
(프로젝트에서 에러가 한번 났었다.)