一個關於 Django Rest Framework 的夢

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 的夢
個人博客:時空路由器

相關文章
相關標籤/搜索