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下paramiko模块实现ssh连接登录Linux服务器
Jun 03 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 Python
Python删除windows垃圾文件的方法
Jul 14 Python
Fiddler如何抓取手机APP数据包
Jan 22 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
django使用xlwt导出excel文件实例代码
Feb 06 Python
python用插值法绘制平滑曲线
Feb 19 Python
Python使用统计函数绘制简单图形实例代码
May 15 Python
django+echart数据动态显示的例子
Aug 12 Python
Python文件操作基础流程解析
Mar 19 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 Python
django使用多个数据库的方法实例
Mar 04 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和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
php实现的简单检验登陆类
2015/06/18 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
2016/12/04 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
跟老齐学Python之Python安装
2014/09/12 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
Python接口自动化测试的实现
2020/08/28 Python
英国团购网站:Groupon英国
2017/11/28 全球购物
如何提高JDBC的性能
2013/04/30 面试题
int和Integer有什么区别
2013/05/25 面试题
体育专业个人求职信范文
2013/12/27 职场文书
《小白兔和小灰兔》教学反思
2014/02/18 职场文书
小露珠教学反思
2014/04/30 职场文书
微笑服务演讲稿
2014/05/13 职场文书
代理人委托书
2014/09/16 职场文书
学校教学工作总结2015
2015/05/19 职场文书
开学第一周值周总结
2015/07/16 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书