Today I Learned
1 )
# 사용자 피드 페이지 serializer
class UserFeedPageSerializer(serializers.ModelSerializer):
followings = MyPageSerializer(many=True) # many=True의 필요성 점검
followers = MyPageSerializer(many=True)
# user_posts = PostSerializer(many=True, read_only=True)
user_posts = serializers.SerializerMethodField()
user_id = serializers.SerializerMethodField()
def get_user_id(self, obj):
return obj.user.id
def get_user_posts(self, obj):
user_id = obj.user.id
posts = Post.objects.filter(author_id=user_id)
posts = PostSerializer(posts, many=True).data
return posts
class Meta:
model = UserProfile
fields = (
"id",
"user_id",
"nickname",
"profile_image",
"introduction",
"followings",
"followers",
"user_posts",
"age",
"gender",
"review_cnt",
)
UserProfile 모델이 Post 모델과 서로 직접 참조를 하고 있지 않음.
따라서 PostSerializer를 불러와 필드로 만들어 정의해도 Serializer가 Post 모델 자체를 인식하지 못하기 때문에
UserProfile 모델에 필드로 추가되지 않던 이슈.
=> SerializerMethodField의 obj 를 통해 내가 보여주고싶은 Post 객체들을 가져와 PostSerializer에 넣고 그 결과값을 반환
2 )
class RoomSerializer(serializers.ModelSerializer):
review_set = AllReviewSerializer(many=True, read_only=True)
class Meta:
model = Rooms
fields = ['id', 'review_set', 'name',
'max_members', 'description', 'price']
#Review 모델
class Review(models.Model):
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
booked = models.ForeignKey(
'hotels.Book', on_delete=models.CASCADE, related_name='booked_users')
room = models.ForeignKey(
'hotels.Rooms', on_delete=models.CASCADE, related_name='review_set')
title = models.CharField(max_length=50)
context = models.TextField(max_length=255)
STAR_CHOICES = (
(1, '1점'),
(2, '2점'),
(3, '3점'),
(4, '4점'),
(5, '5점'),
)
stars = models.PositiveIntegerField(choices=STAR_CHOICES, default=0)
point = models.PositiveIntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return str(self.title)
#Room 모델
class Rooms(models.Model):
all_status = [
('checkin', 'checkin'),
('empty', 'empty'),
]
spot = models.ForeignKey(Spots, on_delete=models.CASCADE)
name = models.CharField(max_length=100, validators=[
contains_special_character])
description = models.TextField(max_length=300, validators=[
MinLengthValidator(10)], error_messages="10자 이상 입력하셔야합니다.")
image = models.ImageField(null=True, blank=True)
price = models.IntegerField(validators=[MinValueValidator(0)], null=False)
max_members = models.IntegerField()
status = models.CharField(choices=all_status, max_length=10)
def get_absolute_url(self):
return reverse('detail_room_view', kwargs={'room_id': self.id})
def __str__(self):
return self.name
해당 숙소에 대한 모든 후기를 불러오기 위해 review_set이라는 relatied_name으로 리뷰에 대한 숙소의 역참조 (room모델에는 review를 외래키로 참조 하고 있지 않는 상태)
=> 1번째 상황은 SerializerMethodField와 같은 방법을 사용하여 원하는 데이터를 직접 가져와야 하며,
2번째 상황 related_name을 사용하여 연결된 모델의 데이터를 손쉽게 가져올 수 있음
'내일배움캠프 > 내일배움캠프 TIL' 카테고리의 다른 글
내일배움캠프 TIL 50일차 (0) | 2023.05.19 |
---|---|
내일배움캠프 TIL 49일차 (0) | 2023.05.19 |
내일배움캠프 TIL 46일차 (0) | 2023.05.15 |
내일배움캠프 TIL 45일차 (0) | 2023.05.13 |
내일배움캠프 TIL 44일차 (0) | 2023.05.12 |