一个关于 Django Rest Framework 的梦
Django Rest Framework 这个框架的相关资料确实少,碰到问题比较难以解决,连睡觉都在思考解决的问题。
最近有一个关于 Django Rest Framework 的问题一直困扰我,在使用视图集 ViewSet 的时候,有时候序列化模型的读写不一定完全一样,这时候该如何输出呢?
所谓日有所思,夜有所梦。昨晚做了一个奇怪的梦。
梦的大概是这样的:
我发现了 Django Rest Framework 在 Response 的时候可以定义一个 Response Serializer Model,这样就可以省去一些不必要显示的字段。
我将信将疑,今天进它的官网查找了一下到底有没有这个 API,发现确实.......果然.........没有。
不过按这个思路还是给了我解决方法,可能这个解决方法有些糙。
比如用户信息的注册和获取,包含以下字段:
username
password
注册的时候需要 username 、 password,然而获取的时候只需要 username 不需要 password,而 serializer 的 fields 又是定义了 username 、 password,这样很矛盾。
解决方法是创建了一个额外的 serializer 模型,fields 里包含 username 字段。然后重写 create 方法,在 Response 之前将原先的序列化模型转换成自定义的序列化模型,然后 Response。
具体解决方法
定义两个 序列化模型,一个用于注册,一个用于显示
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 的 方法里 raise_exception 必须为 , 因为 方法已经创建了用户,所以再次验证的时候会抛出用户已存在的异常,所以用 忽略这个异常。
返回结果
POST data
{ "username": "username", "password": "password" }
response data
{ "username": "username" }
其他方法也同理。
原文地址:一个关于 Django Rest Framework 的梦
我的博客:时空路由器


※真的能原生4K?Xbox One X實際性能測試!
※網站經驗談:網站被降權怎麼辦 如何恢復權重
※如何掌握所有的程序語言
※全局單例換一種姿勢使用
※YI Tunnel「看」一眼即可結賬,傳統零售業迎來「無人店」時代
TAG:推酷 |
※Django Channel處理Websocket鏈接
※你可能不知道的 Django Rest Framework 的兩個新特性
※Django Admin的新皮膚,Google Material 風格皮膚
※django框架:HttpResponse對象
※Nginx+uwsgi部署Django應用
※使用Centos7.5+Nginx+Gunicorn+Django+Python3部署blog項目
※Django Channels實時推送
※Cobbler與Django結合
※如何 Docker 化 Python Django 應用程序
※Django Nginx+uwsgi 安裝配置
※在Django中優化 Postgres 全文搜索
※python後台架構Django——連接讀寫mysql資料庫
※Localhost環境下使用Django send_mail發送郵件-以QQ和163郵箱為例
※python-django 項目部署,不難!
※在 Django中使用 Redis和Celery處理非同步任務
※Django Channels 2.0 發布
※celery4+django2定時任務
※使用Django連接Oracle 11g資料庫
※Python以及Django最小白的環境部署
※Linux+Nginx+Uwsgi+Django 搭建單服務實現多域名訪問