Django REST frameworkの様々なテクニック--2.serializer


serializerは1つのことしかしないので、json化モデルオブジェクトなので、この部分はかなり簡単です.
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
}
  • 外部キーは、groupなどの他のserializerを直接参照することができ、responseのgroupはネストされた
  • であることがわかる.
  • 外部キーのプロパティは、phone
  • のようなsourceを使用することができる.
  • 元のモデルではないものSerializerMethodField(またはモデルではありますが、この値を特別に処理します)
  • を使用します.
    注意点
  • serializerは論理的な操作をすることができますが、クエリーはしないほうがいいです(SerializerMethodFieldでデータ変換をすることができます.例えば、0が偽1になって本物になるとか、複雑なデータベースクエリーはしないほうがいいです).このようなことはviewで行うことができます(select_relatedで複数回のクエリーを減らすことができることに注意してください).これはモデルごとにserializerが必要だからです.
  • フロントエンドペアの変更とクエリーとは異なるserializerを使用する場合は、変更したくないフィールドにreadonly(またはreadonly_fieldsの中に置く)
  • を2つ書きます.
    serializerの論理は簡単で、複雑なものを考えてからにしよう.Done