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实现人人网登录示例分享
Jan 19 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
使用python遍历指定城市的一周气温
Mar 31 Python
Python编程实现从字典中提取子集的方法分析
Feb 09 Python
Python-ElasticSearch搜索查询的讲解
Feb 25 Python
Python3离线安装Requests模块问题
Oct 13 Python
妙用itchat! python实现久坐提醒功能
Nov 25 Python
python使用ctypes调用扩展模块的实例方法
Jan 28 Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 Python
python实现文法左递归的消除方法
May 22 Python
pandas实现导出数据的四种方式
Dec 13 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 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权重计算方法代码分享
2014/01/09 PHP
javascript 日历提醒系统( 兼容所有浏览器 )
2009/04/07 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
JS模仿手机端九宫格登录功能实现代码
2016/04/28 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
[01:27]2014DOTA2展望TI 剑指西雅图IG战队专访
2014/06/30 DOTA
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
python获取外网ip地址的方法总结
2015/07/02 Python
Python实现控制台进度条功能
2016/01/04 Python
python魔法方法-自定义序列详解
2016/07/21 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
如何使用Python实现自动化水军评论
2019/06/26 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
公司企业表扬信
2014/01/11 职场文书
给客户的道歉信
2014/01/13 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
保护环境建议书300字
2014/05/13 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
健康教育主题班会
2015/08/14 职场文书
vue实现锚点定位功能
2021/06/29 Vue.js