티스토리 뷰

Python/Django

Django Reverse_name

cvcvcx9 2023. 4. 28. 14:38

reverse_name FK로 삼은 객체에서 접근하는 방법이다.

기존 접근 방법은 아래와 같다.

post = Post.objects.filter(id=4)

Comment.objects.filter(post_id=4)
Comment.objects.filter(post__id=4)
Comment.objects.filter(post=post)

위와 같은 코드로 post_id가 4인 comment를 찾을 수 있다.

하지만 아래와 같은 코드로도 동일한 동작을 한다.

post.comment_set.all()

바로 fk로 사용하고 있는 post에서 comment를 접근하는 방법이다.

사실 사용자 관점이나, 객체지향적으로 봤을때 이게 자연스럽긴하다.

왜냐하면 댓글은 보통 게시글을 클릭했을 때, 그 게시글에 작성된 댓글을 리스트로 보여주기 때문이다.

댓글에서 게시글의 id를 찾은 다음, 그 게시글에 해당하는 댓글을 보여준다고 생각하기보다는 위의 사고방식이 조금 자연스럽다고 생각된다

reverse_name이 충돌이 발생한다면?

reverse_name 디폴트 이름은 앱이름은 고려하지 않고 모델의 이름만 고려를 함

blog의 Post Model 이 FK로 USER를 가지고 있고, 똑같이 instagram의 Post Model이 FK로 USER를 가지고있다면

마이그레이션 할 때 에러가 뜨게 된다.

이유는 user.post_set.all()을 하는 순간 두 모델의 이름이 같기 때문에, post_set에 할당되는게 두개가 되기 때문이다.

그래서 FK에서 지정해주는 reverse_name을 변경할 필요가 있다.

변경하는 방법은 아래와 같다.

author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="instagram_comment_set")

admin from에서 choice로 fk를 선택하는 곳이 있다.

이곳에서 보면, 공개된 포스트와, 비공개된 포스트에 모두 댓글을 작성할 수 있도록 되어있다.

하지만, 비공개된 포스트에 댓글을 달게 하고싶지 않다.

그런 경우에 아래와 같이 설정한다.

class Post(models.Model):
	is_public = models.BooleanField(default=True, verbose_name="공개여부")
class Comment(models.Model)
	post = models.ForeignKey(Post,limit_choices_to={"is_public": True})

위와 같이 설정하게 되면 이제 선택창에 is_public이 false로 지정되어있는 게시글은 보이지 않게 된다.


Uploaded by N2T

'Python > Django' 카테고리의 다른 글

Django 공식문서 튜토리얼 공부  (0) 2023.05.02
OneToOneField  (0) 2023.04.28
ORM을 통해 데이터 받아오기  (0) 2023.04.26
Static & Media  (0) 2023.04.26
PIP로 설치된 패키지 찾는법  (0) 2023.04.24
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함