장고 모델 related_name 관련

20.01.01 03:41 작성 조회수 47

2

삭제된 글입니다

답변 8

·

답변을 작성해보세요.

2

huge 정말 감사드려요 ㅎ 여러모로 예제파일 개선에 큰 도움이 될것으로 보입니다 정말 감사드립니다 :)

답변 드렸던 User 관련 내용은 오류가 있었던것 같네요

huge님이 이해하셨던 내용들이 맞습니다

related_name의 네이밍 부분에 대한 내용을 이야기 해주셨던것 같아요

살짝 덛붙이자면

like_post_set 으로 제시를 해주셨는데요

liked_post_set

으로 하면 조금더 명확해 질것 같습니다

.

.

.

더불어

추가로 찾아본 결과 realated_name에 '+' 를 입력하면 해당 모델의 역방향 관계를 만들지 않을 수 있네요. 

https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.ForeignKey.related_name

역방향 관계에서 해당모델에 대한 필터를 사용 할 경우에는 

related_query_name을 사용 할 수 있습니다.

https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.ForeignKey.related_query_name

예) 

class Post(models.Modle):

  like_user_set = models.ManyToManyField(settings.AUTH_USER_MODEL,

                                           blank=True,

                                           related_name='liked_post_set', 

related_filter_name='liked_post'

                                           through='Like')  

🌟

좋은 질문을 주셔서 저희 다른강의 들어 주실수 있는 수업쿠폰을 발급해 드릴까하는데요

( 계속해서 좋은 질문 부탁드려요 ㅠ ㅠ )

지난번에 인프런 아이디 알려주실 때 

lsjppp1 로 알려주셨는데요

@뒤에 이메일 전체 주소를 알려주실수 있을까요?

회원검색이 되지를 않아서요 ㅎ 

* facebook클론 수업의 테스터로 참여 하시는 내용도 이메일로 발송 드리도록 하겠습니다

2

hugh님의 프로필

hugh

질문자

2020.01.01

올려주신 전체 소스 코드에서 Post 모델 부분만 따로 떼서 수정했습니다. 필요 없어 보이는 부분은 생략했고요.

class Post(models.Model):
  ...
    like_user_set = models.ManyToManyField(settings.AUTH_USER_MODEL,
                                           blank=True,
                                           related_name='like_post_set', 
                                           through='Like')  # post.like_set 으로 접근 가능
    bookmark_user_set = models.ManyToManyField(settings.AUTH_USER_MODEL,
                                           blank=True,
                                           related_name='bookmark_post_set',
                                           through='Bookmark')  # post.like_set 으로 접근 가능

.

이 되어야 한다고 생각합니다.

.

.

제 생각을 정리를 하자면,

1. {% for like_user in post.like_user_set.all % }

   이 구문이 가능했던 것은 post의 MTM field 의 이름이 like_user_set 이기 때문에 가능한 것, related_name이랑은 관련이 없다. (네이밍을 같게 했기 때문에 발생한 오해)

.

2. related_name은 타겟 모델 (여기에서는 user) 에서 이 모델을 (여기에서는 post) 를 참조할 때 사용하는 이름이다. (역관계라고 하나요?) 따라서 like_user_set 과 같이 쓰면 문법적으로는 문제가 없겠지만, user에서 참조할 때 이해가 잘 안될 것 같습니다.

.

3. related_name은 그 필드를 가진 모델 (여기에서는 post) 가 사용할 수 없다? 이건 저도 잘 모르겠습니다. 일단 저는 안된다고 생각하는데, 된다면 말씀해주세요.

.

.

답변 감사합니다!

2

hugh님의 프로필

hugh

질문자

2020.01.01

답변 감사합니다!

하지만, 제 생각과는 다른 부분이 있네요..

.

{{ for like_user in post.like_user_set.all }}

.

이 구문이 가능한 이유는

.

Post 모델의 models.ManyToManyField() 의 이름을 like_user_set 으로 해서 가능한 것 아닌가요?

만약 저 구문에서 related_name 인자를 전달해 주지 않는다고 하더라도

              for like_user in post.like_user_set.all

이 문장은 에러 없이 수행이 가능할 것 같습니다.

.

.

그리고 related_name이 그 필드로 지정된 모델에서  (이 코드에서는 Post) 사용 가능하다는 것은 제가 확인이 안됩니다. 여러 문서에서도 관련된 내용이 없고,  제가 직접 예제를 만들어서 shell 환경에서 실행시켰는데 없는 속성이라 뜨고요.

혹시 그와 관련된 예제나 문서가 있으시다면 알려주실 수 있으실까요??

1

hugh님의 프로필

hugh

질문자

2020.01.02

시간이 된다면 그 강의도 한번 들어보겠습니다. 감사합니다!

1

네 ㅎ huge님 ~ 동작단위에서 확인을 해보아야 할 것 같아요 huge님 위에 저장소에 내용을 huge님이 맞다고 생각하신 내용으로 변경해서 요청 주셔 보시겠어요? 아니면 huge님이 작업하시고 있는 소스를 공유 주셔도 좋을것 같아요 제가 huge님 질문을 잘못 이해하고 있나 봐요 ~ ㅎ 지송지송 

1

huge님 안녕하세요 

항상 좋은 질문 감사드려요 :) 

relate_name은 외래키로 지정한 User에서만 사용이 가능한 것은 아니세요 

view에서 post_list 라는 값을 전달해 주었다고 생각을 해보면요

{% for post in post_list %}

    {% for like_user in post.like_user_set.all % }

        {{ like_user.profile.nickname }}

    {% endfor %}

{% endfor %}

이런 방식으로 좋아요를 누른 사용자의 이름을 확인해서 출력해주실수가 있으세요

중요한 부분은 post.like_user_set.all 요부분이라고 보시면 됩니다 ^ ^ 

말씀해주신 user.like_uer_set.all()의 방식으로는 보통 post의 좋아요한 회원의 리스트를 가져오지는 않아요 

related_name은 일종에 라벨링 이라고 보시면 될것같아요 이름을 변경하신다고해서 기능적으로 차이는 없으십니다 

장고는 굉장히 유연하게 모델들간의 데이터를 조회하고 조합이 가능합니다

본 강의에서는

User 모델과 맺고 있는 

ForeignKey 

Like 모델과 맺고 있는

[중계모델]

이라는 관계를 통해 자유롭게 데이터를 조회하고 삭제가 가능한 것을 이해하시면 학습목표 달성입니다

혹시 더 궁금하신게 있으시면 질문 남겨주세요 ㅎ

huge님 질문이 좋아서 다른분들도 이해가 더 되실 수 있는 자료가 될 것 같아요 ㅎ

사실 모든 강의에 예제가 완벽하지 않다라는 전제를 가지고 소스코드를 개선하고 있어요 ㅎ

혹시 깃헙 사용이 익숙하시다면 아래 저장소에 PR( Pull Request )를 주시면 추합을 하도록 하겠습니다
https://github.com/kindfamily/instagram_open_dev

huge님 감사합니다 ㅎ  따봉 두개 날려드려요 ~ ㅎ 👍👍

0

huge님 질문은 제 개인적으로나 저희 팀에게나 엄청나게 도움이 많이 됩니다 ^ ^

수업 쿠폰은 말씀해주신 아이디로 발급이 되셨어요

별도에 인증과정은 없구요 로그인하시고 나시면 

아래 수업이 추가가 되어 있으실거에요

해당강좌도 보시면서 개선점이 있다면 얼마든지 이야기 부탁드릴게요 ㅎ

사실 인스타에 비해서 내용이 쉬우실것 같긴 하지만 

현재 인스타에서  질문 주셨던 것 처럼 리펙토링 측면에서 개선된 소스제안을 주시면

감사드리겠습니다

꼭 기회가 된다면 한번 뵙고 싶습니다 :)

제가 밥&차 한잔 사겠습니다 ㅎ

0

hugh님의 프로필

hugh

질문자

2020.01.02

도움이 되셨다면 다행입니다!

이메일 주소는 lsjppp8069@naver.com 으로 해주시면 될 것 같아요!