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 |
๋๊ธ