ネストしたserializerを実装するところで躓いたので、メモとして書く。
#drf-flex-fieldsをインストール
pip install drf-flex-fields
#model
model.py
class User(models.Model):
username = models.CharField(max_length=255)
class Tag(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(User, on_delete=models.CASCADE)
tag = models.ManyToManyField(Tag)
#serializer
serializers.py
from rest_flex_fields import FlexFieldsModelSerializer
class UserSerializer(FlexFieldsModelSerializer):
class Meta:
model = User
fields = ("id", "username")
class TagSerializer(FlexFieldsModelSerializer):
class Meta:
model = User
fields = ("id", "name")
class BookSerializer(FlexFieldsModelSerializer):
class Meta:
model = Book
fields = ("id", "title", "author", "tag")
expandable_fields = { #expandable_fieldsでネスト
"author": UserSerializer,
"tag": (TagSerializer, {"many": True}) #多対多
}
#Response
[
{
"id": 1,
"title": title_1,
"author": 1,
"tag": [
1,
2,
]
},
]
#データを動的表示
パラメータを指定して動的なデータを表示する
オプション | 説明 |
---|---|
expand | 指定されたフィールドを展開する |
fields | 指定されたフィールドのみを表示させる |
omit | 指定されたフィールドが表示されない |
##expand | |
http://localhost:8000/book/1?expand=author,tag | |
authorとtagを展開させる |
[
{
"id": 1,
"title": title_1,
"author": {
"id": 1,
"username": "user_1"
},
"tag": [
{
"id": 1,
"name": "tag_1"
},
{
"id": 2,
"name": "tag_2"
},
]
},
]
##fields
http://localhost:8000/book/1?fields=title
タイトルのみを表示させる
[
{
"title": title_1,
},
]
##omit
http://localhost:8000/book/1?omit=title
タイトルを表示させない
[
{
"id": 1,
"author": 1,
"tag": [
1,
2,
]
},
]
#参考
rsinger86/drf-flex-fields - github
drf-flex-fields - pypi