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读写文件方法总结
Jun 09 Python
深入解析Python中的urllib2模块
Nov 13 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
python实现趣味图片字符化
Apr 30 Python
python 直接赋值和copy的区别详解
Aug 07 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
python迭代器常见用法实例分析
Nov 22 Python
python装饰器使用实例详解
Dec 14 Python
Python编写memcached启动脚本代码实例
Aug 14 Python
如何将Pycharm中调整字体大小的方式设置为"ctrl+鼠标滚轮上下滑"
Nov 17 Python
python如何获取网络数据
Apr 11 Python
Python基础之进程详解
May 21 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类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
培训班开班仪式主持词
2014/03/28 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python