Django Serializer HiddenField隐藏字段实例


Posted in Python onMarch 31, 2020

Django rest_framework serializer.HiddenField(default=serializer.CurrentUser())

在用Dajngo RestFramework时, 有时候需要这么一个场景,前端不需要传一个或多个字段,这些字是直接根据用户登录信息判断自动赋值的,如果用mixin和viewset进行搭配写接口,要么重写create, update等方法,要么就是在serializer_class时就定义默认值,而第二种方法明显简单一些。

具体看代码

# 假如我定义了一个serliazer,shop和status都是自动判断后赋值的
# 用HiddenField定义字段,default方法来写具体赋值函数
# default方法是一个类,需要重写set_context的方法
from rest_framework.compat import (
 InvalidTimeError, MaxLengthValidator, MaxValueValidator,
 MinLengthValidator, MinValueValidator, unicode_repr, unicode_to_repr
)
class CurrentShopDefault(object):
 def set_context(self, serializer_field):
  self.shop = serializer_field.context['request'].user.shop

 def __call__(self):
  return self.shop

 def __repr__(self):
  return unicode_to_repr('%s()' % self.__class__.__name__)

class CurrentStatus(object):
 def set_context(self, serializer_field):
  user_info = serializer_field.context['request'].user
  if user_info.shop.shop_type == 'SHOP_TYPE_COMCIRCLE':
   self.status = 1
  else:
   self.status = 2

 def __call__(self):
  return self.status

 def __repr__(self):
  return unicode_to_repr('%s()' % self.__class__.__name__)

# 定义serializer
class GameSerializer(serializers.ModelSerializer):
 class Meta:
  model = Game
  exclude = ['created_time']

 shop = serializers.HiddenField(
  default=CurrentShopDefault()
 )
 status = serializers.HiddenField(
  default=CurrentStatus()
 )

最后在view文件的class里直接指定serializer_class就好了

class GameOpView(mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
 """
  retrieve:
   获取-游戏详情
  create:
   创建-游戏
  update:
   更新-游戏
  delete:
   删除-游戏
  partial_update:
   更新游戏状态
  total_info:
   游戏数据总览
 """
 permission_classes = [IsShop, ]
 pagination_class = StandardResultsSetPagination

 def get_queryset(self):
  return Game.objects.filter(
   Q(shop=self.request.user.shop) | Q(shop__com_circle=self.request.user.shop))

 def get_serializer_class(self):
  if self.action == 'partial_update':
   return GameStatusSerializer
  elif self.action == 'retrieve':
   return GameReadSerializer
  else:
   return GameSerializer

补充知识:drf 中serializers.HiddenField使用方法

class CurrentUser(object):
 def set_context(self, serializer_field):
  self.user_obj = serializer_field.context['request'].user

 def __call__(self):
  return self.user_obj

class GetObjectFlow(object):
 def set_context(self, serializer_field):
  self.object_flow = serializer_field.context['request'].data.get('object_flow') # 这里需要在views中传进去呀,djangocontext上下文中才能取到

 def __call__(self):
  return self.object_flow


class AddHolidaySerializer(serializers.ModelSerializer, BaseModelSerializer):
 user = serializers.HiddenField(default=CurrentUser()) # 给用户外键赋当前请求的user
 object_flow = serializers.HiddenField(default=GetObjectFlow()) # 后端自己处理一些特殊的外键
 status = serializers.HiddenField(default=0) # 默认新增时给status赋初值

 class Meta:
  model = Holiday
  exclude = ('deleted',)

以上这篇Django Serializer HiddenField隐藏字段实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
一篇不错的Python入门教程
Feb 08 Python
pycharm 使用心得(三)Hello world!
Jun 05 Python
python中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
python使用wmi模块获取windows下的系统信息 监控系统
Oct 27 Python
python实现搜索本地文件信息写入文件的方法
Feb 22 Python
深入理解Django的自定义过滤器
Oct 17 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
appium+python adb常用命令分享
Mar 06 Python
python入门:argparse浅析 nargs='+'作用
Jul 12 Python
Python是怎样处理json模块的
Jul 16 Python
详解python变量与数据类型
Aug 25 Python
python如何提升爬虫效率
Sep 27 Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 #Python
Python3 hashlib密码散列算法原理详解
Mar 30 #Python
django xadmin action兼容自定义model权限教程
Mar 30 #Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 #Python
Django admin 实现search_fields精确查询实例
Mar 30 #Python
Django模型中字段属性choice使用说明
Mar 30 #Python
Django+python服务器部署与环境部署教程详解
Mar 30 #Python
You might like
php猜单词游戏
2015/09/29 PHP
php7下的filesize函数
2019/09/30 PHP
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
2015/10/29 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
微信小程序获取用户信息并保存登录状态详解
2019/05/10 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
python在命令行下使用google翻译(带语音)
2014/01/16 Python
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
2017/12/09 Python
用python实现的线程池实例代码
2018/01/06 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
python实现对输入的密文加密
2019/03/20 Python
python包的导入方式总结
2021/03/02 Python
Python与C/C++的相互调用案例
2021/03/04 Python
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
大专生自荐信
2013/10/04 职场文书
电信专业毕业生推荐信
2013/11/18 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
工作失误检讨书范文
2015/01/26 职场文书
2015年语文教学工作总结
2015/05/25 职场文书
MySQL 字符集 character
2022/05/04 MySQL
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python