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网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
python async with和async for的使用
Jun 20 Python
python pandas时序处理相关功能详解
Jul 03 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
python连接mongodb集群方法详解
Feb 13 Python
python用TensorFlow做图像识别的实现
Apr 21 Python
利用Vscode进行Python开发环境配置的步骤
Jun 22 Python
python中数字是否为可变类型
Jul 08 Python
python如何实现DES加密
Sep 21 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 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检测用户语言的方法
2015/06/15 PHP
php无序树实现方法
2015/07/28 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
CutePsWheel javascript libary 控制输入文本框为可使用滚轮控制的js库
2010/02/07 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
2015/08/10 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
JavaScript实现开关等效果
2017/09/08 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
JavaScript构造函数原理及实现流程解析
2020/11/19 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python函数嵌套实例
2014/09/23 Python
python编程开发之日期操作实例分析
2015/11/13 Python
python算法表示概念扫盲教程
2017/04/13 Python
使用XML库的方式,实现RPC通信的方法(推荐)
2017/06/14 Python
解决python报错MemoryError的问题
2018/06/26 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
AJAX的优缺点都有什么
2015/08/18 面试题
什么是GWT的Module
2013/01/20 面试题
运动会100米解说词
2014/01/23 职场文书
找工作求职信
2014/07/07 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
教你使用Python pypinyin库实现汉字转拼音
2021/05/27 Python
Python中的socket网络模块介绍
2022/07/23 Python