티스토리 뷰

서론

Rest Framework로 작업하던 중 관계가 있는 특정 쿼리셋(예를 들어 첫번째 레코드만)만 지정해서 Serialize하는 방법을 소개합니다.

본론

다음과 같이 1:N관계인 account와 helathData 모델이 있습니다.

class Account(models.Model):
    email = models.EmailField()
    password = models.CharField()
    note = models.TextField()

class HealthData(models.Model):
    account = models.ForeignKey(to=HuamiAccount, 
                                on_delete=models.CASCADE
                                related_name="health")
    date = models.DateField()
    heart_rate = models.TextField()

이 상태에서 serializer를 사용할 때 가장 최근 healthData를 가져오는 것을 구현합니다.

property로 쿼리셋 지정하기

Account 모델에서 가장 최근의 HealthData를 가져오는 property를 작성합니다. queryset을 작성하여 적절한 레코드를 가져옵니다.

class Account(models.Model):
    email = models.EmailField()
    password = models.CharField()
    note = models.TextField()

    @property
    def last_health(self):
        return self.health.last()

serializer 작성하기

last_health 라는 이름으로 만든 property를 HelathSerializer를 이용해 시리얼라이즈화 합니다.

class HealthSerializer(serializers.ModelSerializer):
    class Meta:
        model = HealthData
        fields = ['date', 'heart_rate']

class AccountSerializer(serializers.ModelSerializer):
    last_health = HealthSerializer()

    class Meta:
        model = Account
        fields = ['email', 'note', 'last_health']

결과

위의 시리얼라이저를 사용한 detail 뷰를 만들어 조회해보았습니다.

{
    "full_name": "이 누렁",
    "note": "아름다운 금수강산",
    "last_health_info": {
        "date": "2023-08-10",
        "heart_rate": "top secrect"
    }
}

결론

시리얼라이저 자체에서 쿼리셋을 만들어 사용하는 방법도 찾아보고는 있는데 찾지 못해서 위와 같은 방법으로 대체했습니다. 더 찾아보면 좋을 것 같습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
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
글 보관함