티스토리 뷰

WEB/Django

Hidden Model Fields in Django

취뽀가자!! 2018. 12. 24. 16:54

Hidden Model Fields in Django

foreign key의 뜻은 참고하고 있는 모델의 ID이다. 아래와 같은 모델의 경우에는 ID가 1이다. 그리고 ID 1의 소유자가 이미지 생성자인 것이다.

class Image(TimeStampedModel):

""" Image Model """

file = models.ImageField()
location = models.CharField(max_length=140)
caption = models.TextField()
creator = models.ForeignKey(user_models.User, on_delete=models.PROTECT, null=True,)

def __str__(self):
return '{} - {}'.format(self.location, self.caption)



이제 id가 1인 이미지에 누가 댓글을 달았는지 알고 싶을것이다. 그러기 위해서 댓글 중에 이미지 ID가 1인 댓글들은 모두 해당 이미지의 댓글들일 것이다. 하지만 이런 방법은 일일이 Id가 1인 댓글들을 모두 찾아야 하기 때문에 굉장히 비효율적이다. 그런데 다행이도, 장고에서는 set이라는 것을 통해 이런 작업들을 처리해준다.


class ImageSerializer(serializers.ModelSerializer):

class Meta:
model=models.Image
fields='__all__'

이미지 시리얼라이저에서는 image_set을 사용할 수 없다. 왜냐하면 위 코드에서 모든 field를 불러온다고 했지만 사실은 set_field가 없기 때문에 모든 필드를 부르는 것이 아니다.


그래서 구체적으로 불러와야 한다.


class ImageSerializer(serializers.ModelSerializer):

class Meta:
model=models.Image
fields=(
'id',
'file',
'location',
'caption',
'comment_set',
)


어드민 페이지를 새로고침 해 보자,



comment_set에서 id리스트를 볼 수 있다. 댓글을 더 추가해 보자.



이제 댓글이 2개가 보인다. 


Nested Serializer

이제 여기서 아이디 말고 데이터도 보고 싶을 경우 Nested serializer를 사용하면 된다.


from rest_framework import serializers
from . import models

class CommentSerializer(serializers.ModelSerializer):

class Meta:
model=models.Comment
fields='__all__'

class LikeSerializer(serializers.ModelSerializer):

class Meta:
model=models.Like
fields='__all__'

class ImageSerializer(serializers.ModelSerializer):

comment_set=CommentSerializer(many=True)

class Meta:
model=models.Image
fields=(
'id',
'file',
'location',
'caption',
'comment_set',
)



이렇게 서로 연결된 오브젝트를 불러올 수 있다.


유저도 마찬가지다. 유저는 image_set이라는 것이 있다. 왜냐면 유저를 향하고 있는 이미지 모델이 있기 때문이다.

creator = models.ForeignKey(user_models.User, on_delete=models.PROTECT, null=True,)


set이 생성되는 방식은, 두 번째 모델을 향하고 있을 때, 해당 모델의 set이름은 첫 번째 모델 이름을 갖게 된다.


다시 설명하면, Image model(하늘색)이 User(빨간색)모델을 가리키고 있을 때 User모델은 set을 갖게 된다. 이는 User 모델을 가리키고 있는 모든 모델의 세트가 되는 것이다.

class Image(TimeStampedModel):

""" Image Model """

file = models.ImageField()
location = models.CharField(max_length=140)
caption = models.TextField()
creator = models.ForeignKey(user_models.User, on_delete=models.PROTECT, null=True,)

def __str__(self):
return '{} - {}'.format(self.location, self.caption)


Related_name

related_name이란, 이미지는 댓글을 찾을 것이고, 댓글을 찾는 방법은 그들의 related_name을 부르는 방법인데  디폴트로 연결된 이름은 위에서 사용한 set을 사용할 것이다. 그냥 comments라고 작성하겠다. 

class Comment(TimeStampedModel):

""" Comment Model """

message = models.TextField()
creator = models.ForeignKey(user_models.User, on_delete=models.PROTECT, null=True)
image = models.ForeignKey(Image, on_delete=models.PROTECT, null=True, related_name='comments')

def __str__(self):
return self.message



결국 set은 연결된 모델을 그룹핑하는 방법인 것이다. 이전에는 foriegn key만 존재했고 forieng key로 해당 id를 연결해줬었다.


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

로그인/로그아웃/회원가입 기능 구현  (0) 2019.01.07
JWT(Json Web Token)  (0) 2019.01.07
The Request Object in Django  (0) 2018.12.25
Creating the URLS and Testing the images serializers  (0) 2018.12.24
Customizing the Django Admin  (0) 2018.12.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함