๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Personal_Study/Django

DynamicFieldsModelSerializer

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 11. 6.

DynamicFieldsModelSerializer

๊ฐœ์š”

Django์˜ DjangoRESTFramework(DRF)๋Š” ์ž์ฒด์ ์œผ๋กœ serializer ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ view ํ•จ์ˆ˜์—์„œ ํ•ด๋‹น model์˜ ํŠน์ • field๋งŒ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜, ํ˜น์€ nested relationship์—์„œ ํŠน์ • field๋งŒ ์ƒ์†๋ฐ›๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

ํ•œ๋‘ ๊ฐœ๋ผ๋ฉด ๋”ฐ๋กœ serializer๋ฅผ ๋งŒ๋“ค์–ด์ค„ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๋ณ€์ˆ˜๋ช… ์ง“๊ธฐ๋„ ์–ด๋ ค์›Œ์ง„๋‹ค.

 

๋”ฐ๋ผ์„œ 'field' ์ธ์ž๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•ด ์›ํ•˜๋Š” field๋งŒ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜๋Š” DynamicFieldsModelSerializer ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ

Serializer ํด๋ž˜์Šค ์ •์˜

from rest_framework import serializers


class DynamicFieldsModelSerializer(serializers.ModelSerializer):
    """
    A ModelSerializer that takes an additional `fields` argument that
    controls which fields should be displayed.
    """

    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        fields = kwargs.pop("fields", None)

        # Instantiate the superclass normally
        super().__init__(*args, **kwargs)

        if fields is not None:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)

์‚ฌ์šฉ ์˜ˆ์‹œ (nested relationship)

class ActorNameSerializer(DynamicFieldsModelSerializer):
    class Meta:
        model = Actor
        fields = ["name"]


class ReviewSerializer(DynamicFieldsModelSerializer):
    movie = MovieTitleSerializer(read_only=True)

    class Meta:
        model = Review
        fields = "__all__"


class MovieSerializer(DynamicFieldsModelSerializer):
    actors = ActorNameSerializer(many=True, read_only=True)
    # ReviewSerializer์—์„œ title, content ํ•„๋“œ๋งŒ ๋ฐ›์•„์˜จ๋‹ค.
    review_set = ReviewSerializer(
        many=True,
        read_only=True,
        fields=[
            "title",
            "content",
        ],
    )

    class Meta:
        model = Movie
        fields = "__all__"

์‚ฌ์šฉ ์˜ˆ์‹œ (views.py)

@api_view(["GET"])
def review_list(request):
    if request.method == "GET":
        reviews = get_list_or_404(Review)
        # ReviewSerializer์—์„œ ํŠน์ • ํ•„๋“œ๋งŒ ์„ ํƒํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ค€๋‹ค.
        serializer = ReviewSerializer(
            reviews,
            many=True,
            fields=[
                "title",
                "content",
            ],
        )
        return Response(serializer.data)

์ฐธ๊ณ  ์ž๋ฃŒ

๊ณต์‹๋ฌธ์„œ: https://www.django-rest-framework.org/api-guide/serializers/#dynamically-modifying-fields

'โญ Personal_Study > Django' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Django REST framework - N:1 Relation  (1) 2022.10.27
Django REST framework - Single Model  (0) 2022.10.26
Django: Response JSON  (0) 2022.10.25
(M:N) User- User Relationship  (0) 2022.10.18
(M:N) Article - User Relationship  (0) 2022.10.17

๋Œ“๊ธ€