Django REST frameworkの様々なテクニック--2.serializer
3496 ワード
serializerは1つのことしかしないので、json化モデルオブジェクトなので、この部分はかなり簡単です.
Django REST frameworkの様々なテクニック【ディレクトリインデックス】
いちばん上に書く
すべてのコードは次の2つのバージョンで作られています.
まずは公式文書
説明する
基本的なuser,groupを例に
まず関連モデル
User対応serializer
リクエストresponse外部キーは、groupなどの他のserializerを直接参照することができ、responseのgroupはネストされた であることがわかる.外部キーのプロパティは、phone のようなsourceを使用することができる.元のモデルではないものSerializerMethodField(またはモデルではありますが、この値を特別に処理します) を使用します.
注意点 serializerは論理的な操作をすることができますが、クエリーはしないほうがいいです(SerializerMethodFieldでデータ変換をすることができます.例えば、0が偽1になって本物になるとか、複雑なデータベースクエリーはしないほうがいいです).このようなことはviewで行うことができます(select_relatedで複数回のクエリーを減らすことができることに注意してください).これはモデルごとにserializerが必要だからです. フロントエンドペアの変更とクエリーとは異なるserializerを使用する場合は、変更したくないフィールドにreadonly(またはreadonly_fieldsの中に置く) を2つ書きます.
serializerの論理は簡単で、複雑なものを考えてからにしよう.Done
Django REST frameworkの様々なテクニック【ディレクトリインデックス】
いちばん上に書く
すべてのコードは次の2つのバージョンで作られています.
django==1.8.8
djangorestframework==3.2.5
まずは公式文書
説明する
基本的なuser,groupを例に
まず関連モデル
class UserProfile(TimeStampedModel):
user = models.OneToOneField(User, unique=True, db_index=True, related_name='profile')
name = models.CharField(blank=True, max_length=255, db_index=True)
phone = models.CharField(default='', blank=True, max_length=64)
nickname = models.CharField(blank=True, null=True, max_length=255, db_index=True)
avatar = models.URLField(blank=True, max_length=255, default='')
is_cms_user = models.BooleanField(default=False, db_index=True)
is_cms_active = models.BooleanField(default=False, db_index=True)
class Meta: # pylint: disable=missing-docstring
db_table = "auth_userprofile"
def __unicode__(self):
return self.name
User対応serializer
class GroupSerializer(serializers.ModelSerializer):
class Meta:
model = Group
fields = ('id', 'name')
class UserSerializer(serializers.ModelSerializer):
groups = GroupSerializer(many=True)
phone = serializers.CharField(source='profile.phone', read_only=True)
name = serializers.CharField(source='profile.name', read_only=True)
menus = serializers.SerializerMethodField()
is_active = serializers.BooleanField(source='profile.is_cms_active')
def get_menus(self, user):
return get_menus(user)
class Meta:
model = User
fields = ('id', 'username', 'name', 'email', 'phone', 'groups', 'menus', 'is_active')
リクエストresponse
{
"id": 2,
"username": "duoduo3369",
"name": "",
"email": "",
"phone": "",
"groups": [
{
"id": 1,
"name": "sysadmin"
},
{
"id": 17,
"name": " 2"
}
],
"menus": [
{
"menu": [
{
"menu": [],
"codename": "information.announcement",
"name": " ",
"order": 1
},
{
"menu": [],
"codename": "information.examinfo",
"name": " ",
"order": 2
}
]
}
],
"is_active": false
}
注意点
serializerの論理は簡単で、複雑なものを考えてからにしよう.Done