Django REST framework的各類技巧——2.serializer

serializer只作一件事情,json化model對象,因此這一部分至關簡單前端

Django REST framework的各類技巧【目錄索引】數據庫

寫在最上面

全部的代碼都是在下面的兩個版原本作的django

django==1.8.8
djangorestframework==3.2.5

首先是官方文檔json

講解

拿基本的user,group爲例子api

首先一個關聯的modelide

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對應的serializerui

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.net

{
    "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,例如group,能夠看到response中group是嵌套的
  • 外鍵的屬性可使用source,例如phone
  • 不在原來model上的東西使用SerializerMethodField(或者在model上可是你要對這個值作一些特殊處理)

注意點

  • serializer能夠作邏輯上的操做,然而最好不要作查詢(你能夠用SerializerMethodField作一些數據轉換例如0變爲假1變爲真什麼的,然而最好不要作複雜的數據庫查詢),這種事情能夠在view上作好(注意能夠用select_related減小屢次查詢),由於這是每個model都要serializer一次。
  • 若是說跟前端對的修改和查詢使用不一樣的serializer,那麼你就寫兩個,不但願修改的字段加上readonly(或者放在readonly_fields裏面)

serializer的邏輯很簡單,想到複雜的東西再說。Donerest

相關文章
相關標籤/搜索