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 相关文章推荐
在Django同1个页面中的多表单处理详解
Jan 25 Python
Python+tkinter模拟“记住我”自动登录实例代码
Jan 16 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
Jun 26 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
Python程序暂停的正常处理方法
Nov 07 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
Jan 04 Python
Python实现电视里的5毛特效实例代码详解
May 15 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
如何用python写个模板引擎
Jan 14 Python
python基础之文件处理知识总结
May 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
基于mysql的bbs设计(一)
2006/10/09 PHP
解析curl提交GET,POST,Cookie的简单方法
2013/06/29 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
拖拉表格的JS函数
2008/11/20 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
python 判断自定义对象类型
2009/03/21 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
python如何对实例属性进行类型检查
2018/03/20 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
公务员职务工作的自我评价
2013/11/01 职场文书
售后服务承诺书
2014/03/26 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers