Django Rest Framework 這個框架的相關資料確實少,碰到問題比較難以解決,連睡覺都在思考解決的問題。python
最近有一個關於 Django Rest Framework 的問題一直困擾我,在使用視圖集 ViewSet 的時候,有時候序列化模型的讀寫不必定徹底同樣,這時候該如何輸出呢?框架
所謂日有所思,夜有所夢。昨晚作了一個奇怪的夢。ide
夢的大概是這樣的:code
我發現了 Django Rest Framework 在 Response 的時候能夠定義一個 Response Serializer Model,這樣就能夠省去一些沒必要要顯示的字段。orm
我將信將疑,今天進它的官網查找了一下到底有沒有這個 API,發現確實.......果真.........沒有。路由
不過按這個思路仍是給了我解決方法,可能這個解決方法有些糙。get
好比用戶信息的註冊和獲取,包含如下字段:博客
usernameio
passwordform
註冊的時候須要 username 、 password,然而獲取的時候只須要 username 不須要 password,而 serializer 的 fields 又是定義了 username 、 password,這樣很矛盾。
解決方法是建立了一個額外的 serializer 模型,fields 裏包含 username 字段。而後重寫 create 方法,在 Response 以前將原先的序列化模型轉換成自定義的序列化模型,而後 Response。
定義兩個 User
序列化模型,一個用於註冊,一個用於顯示
class RegisterSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('id', 'username', 'password') class DisplaySerializer(serializers.ModelSerializer): class Meta: model = User fields = ('id', 'username')
重寫 create 方法,註冊後返回用戶的基本信息,而不包含密碼
def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) display_serializer = DisplaySerializer(data=serializer.data) display_serializer.is_valid(raise_exception=False) return Response(droider_serializer.data, status=status.HTTP_201_CREATED, headers=headers)
display_serializer 的 is_valid()
方法裏 raise_exception 必須爲 False
, 由於 self.perform_create()
方法已經建立了用戶,因此再次驗證的時候會拋出 用戶已存在 的異常,因此用 False
忽略這個異常。
POST data
{ "username": "username", "password": "password" }
response data
{ "username": "username" }
其餘方法也同理。
原文地址:一個關於 Django Rest Framework 的夢
個人博客:時空路由器