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之Python安装
Sep 12 Python
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
python 字符串转列表 list 出现\ufeff的解决方法
Jun 22 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
分享vim python缩进等一些配置
Jul 02 Python
python通过zabbix api获取主机
Sep 17 Python
对Python协程之异步同步的区别详解
Feb 19 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
python 创建一维的0向量实例
Dec 02 Python
python开发入门——set的使用
Sep 03 Python
解决numpy数组互换两行及赋值的问题
Apr 17 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
phpfans留言版用到的install.php
2007/01/04 PHP
PHP 采集获取指定网址的内容
2010/01/05 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
JavaScript中null与undefined分析
2009/07/25 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
浅谈javascript 迭代方法
2015/01/21 Javascript
js实现将选中值累加到文本框的方法
2015/08/12 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
vue-cli项目中使用Mockjs详解
2018/05/14 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
python集合类型用法分析
2015/04/08 Python
利用Python破解斗地主残局详解
2017/06/30 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
PHP面试题及答案二
2015/05/23 面试题
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
怎样自定义一个异常类
2016/09/27 面试题
2014年教师培训的自我评价
2014/01/03 职场文书
团队拓展活动总结
2014/08/27 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
MySQL创建管理KEY分区
2022/04/13 MySQL
Win2008系统搭建DHCP服务器
2022/06/25 Servers