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