본문 바로가기
Python/Django

[DRF] Serializer - depth, repr()

by 코드뭉치 2023. 6. 6.

1️⃣depth

 

Article이 "title", "content", "author" 필드를 가지고 있고,

이 중 author 필드가 user와 ForeignKey관계라고 가정.

class Article(models.Model):
    title = models.CharField ...
    content = models.CharField ...
    author = models.ForeignKey(User, ...)
    
class ArticleSerializer(ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'
        depth = 1

 

이렇게 Serializer에 depth를 1로 주면 GET 요청으로 Article 객체를 가져올 때,

User의 모든 정보까지도 가져올 수 있다.

 

{
    "id": 1,
    "title": "Example Article",
    "content": "Lorem ipsum dolor sit amet...",
    "author": {
        "id": 1,
        "username": "example_user",
        "email": "user@example.com",
        "first_name": "John",
        "last_name": "Doe",
        "profile": 1
    }
}

 

그렇지만 User와 OnetoOne 관계인 profile의 경우, PrimaryKey만을 가져오고 있다.

여기서 만약 depth가 2가 된다면? User와 관계 필드에 있는 데이터까지 가져온다.

 

{
    "id": 1,
    "title": "Example Article",
    "content": "Lorem ipsum dolor sit amet...",
    "author": {
        "id": 1,
        "username": "example_user",
        "email": "user@example.com",
        "first_name": "John",
        "last_name": "Doe",
        "profile": {
            "id": 1,
            "bio": "Lorem ipsum dolor sit amet...",
            "website": "https://example.com",
            ...
        }
    }
}

 

이런식으로 depth가 높아질수록, 더 깊은 데이터를 가져올 수 있다.

 

 

2️⃣repr()

 

repr메소드는 원래 해당 객체의 문자열 표현을 반환한다.

DRF의 ModelSerializer는 해당 Serializer가 담고 있는 값들을 보여주도록

__repr__() 메서드를 통해 오버라이딩 되어있다.

이를 사용해서 해당 serializer가 가지고 있는 값들을 볼 수 있다.

 

예시)

아래와 같은 Model과 Serializer가 있다고 가정.

 

class Article(models.Model):
    title = models.CharField(max_length=25)
    content = models.CharField(max_length=25)
    
class ArticleSerializer(serializers.ModelSerializer):
    length = serializers.SerializerMethodField()

    def get_length(self, obj):
        return len(obj.content)

    class Meta:
        model = Article
        exclude = ['id']

 

serializer = ArticleSerializer()
print(repr(serializer))

 

해당 코드를 실행하면

아래와 같이 필드의 정보가 출력된다.

 

ArticleSerializer():
    length = SerializerMethodField()
    title = CharField(max_length=25)
    content = CharField(max_length=25)

 

 

댓글