class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL , on_delete = models.CASCADE)
message = models.TextField()
photo = models.ImageField(blank = True , upload_to='instagram/post/%Y%m%d')
is_public = models.BooleanField(default=False , verbose_name='공개여부')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f'Custom Post object({self.message})'
def message_length(self):
return len(self.message)
message_length.short_description = '메세지 글자수'
class Meta:
ordering = ['-id']
class Comment(models.Model):
post = models.ForeignKey('Post' , on_delete = models.CASCADE) # post_id 필드가 생성
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
하나의 post 에 댓글이 만약에 두개가 있다고 한다면 ,
댓글이라는 녀석이 post 를 바라보고 있을것이다 .
In [21]: post = Post.objects.first()
In [22]: post
Out[22]: <Post: Custom Post object(세번째)>
In [23]: Comment.objects.filter(post__id=3)
Out[23]: <QuerySet [<Comment: Comment object (1)>, <Comment: Comment object (2)>]>
In [24]: Comment.objects.filter(post=post)
Out[24]: <QuerySet [<Comment: Comment object (1)>, <Comment: Comment object (2)>]>
In [25]: post.comment_set.all()
Out[25]: <QuerySet [<Comment: Comment object (1)>, <Comment: Comment object (2)>]>
기존에는
data =Post.objects.get(id=1).prefetch_related('comment_set')
으로 가져와서 post 와 comment 둘다 data 에 담아서 가져왔었지만 ,
만약에 comment 만필요하다고 한다면 그럴필요없이
"모델명소문자_set"
을 하면된다
post = Post.objects.first()
만약에 다른 앱에 같은 이름의 모델이 존재하게 될때는
충돌이 날경우가 생긴다.
그럴경우 reverse_name 을 지정해주거나 변경을 하면 된다.