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实现sublime3的less编译插件示例
Apr 27 Python
python自然语言编码转换模块codecs介绍
Apr 08 Python
python实现红包裂变算法
Feb 16 Python
python多进程读图提取特征存npy
May 21 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
python3 实现口罩抽签的功能
Mar 11 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
Cpython解释器中的GIL全局解释器锁
Nov 09 Python
Django cookie和session的应用场景及如何使用
Apr 29 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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
咖啡知识大全
2021/03/03 新手入门
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
linux中cd命令使用详解
2015/01/08 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
js left,right,mid函数
2008/06/10 Javascript
js保存当前路径(cookies记录)
2010/12/14 Javascript
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
extjs render 用法介绍
2013/09/11 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
js中的caller和callee属性介绍和例子
2014/06/07 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
python 控制语句
2011/11/03 Python
python实现聊天小程序
2018/03/13 Python
机电专业个人自荐信格式模板
2013/09/23 职场文书
晚会主持词开场白
2014/03/17 职场文书
基层党员公开承诺书
2014/05/29 职场文书
2014年党支部承诺书
2014/05/30 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
公司委托书格式
2014/08/01 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
python绘制云雨图raincloud plot
2022/08/05 Python