serializer只作一件事情,json化model對象,因此這一部分至關簡單前端
Django REST framework的各類技巧【目錄索引】數據庫
全部的代碼都是在下面的兩個版原本作的django
django==1.8.8 djangorestframework==3.2.5
首先是官方文檔json
拿基本的user,group爲例子segmentfault
首先一個關聯的modelapi
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對應的serializeride
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')
一個請求的responseui
{ "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是嵌套的rest
外鍵的屬性可使用source,例如phonecode
不在原來model上的東西使用SerializerMethodField(或者在model上可是你要對這個值作一些特殊處理)
serializer能夠作邏輯上的操做,然而最好不要作查詢(你能夠用SerializerMethodField作一些數據轉換例如0變爲假1變爲真什麼的,然而最好不要作複雜的數據庫查詢),這種事情能夠在view上作好(注意能夠用select_related減小屢次查詢),由於這是每個model都要serializer一次。
若是說跟前端對的修改和查詢使用不一樣的serializer,那麼你就寫兩個,不但願修改的字段加上readonly(或者放在readonly_fields裏面)
serializer的邏輯很簡單,想到複雜的東西再說。Done