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用字典统计单词或汉字词个数示例
Apr 22 Python
Python使用PyGreSQL操作PostgreSQL数据库教程
Jul 30 Python
python使用cPickle模块序列化实例
Sep 25 Python
python实现Zabbix-API监控
Sep 17 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
Python实现网站表单提交和模板
Jan 15 Python
ERLANG和PYTHON互通实现过程详解
Jul 05 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
Python中base64与xml取值结合问题
Dec 22 Python
如何使用Python对NetCDF数据做空间相关分析
Apr 21 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 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
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
PHP 自定义错误处理函数trigger_error()
2013/03/26 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
Laravel下生成验证码的类
2017/11/15 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
如何在PHP中使用AES加密算法加密数据
2020/06/24 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
原生js实现放大镜
2017/02/20 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
JavaScript callback回调函数用法实例分析
2018/05/08 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
2018/12/10 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
python tkinter实现屏保程序
2019/07/30 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
执行Python程序时模块报错问题
2020/03/26 Python
python实现猜数游戏
2020/03/27 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
python 5个顶级异步框架推荐
2020/09/09 Python
Html5 localStorage入门教程
2018/04/26 HTML / CSS
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
工程管理造价应届生求职信
2013/11/13 职场文书
授权委托书格式范文
2014/08/02 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
素质拓展训练感想
2015/08/07 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang