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之引用和类属性的初步理解
May 15 Python
在Django框架中设置语言偏好的教程
Jul 27 Python
Python创建对称矩阵的方法示例【基于numpy模块】
Oct 12 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
Python2.7.10以上pip更新及其他包的安装教程
Jun 12 Python
TensorFlow 模型载入方法汇总(小结)
Jun 19 Python
对pandas写入读取h5文件的方法详解
Dec 28 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
pymysql 开启调试模式的实现
Sep 24 Python
搭建pypi私有仓库实现过程详解
Nov 25 Python
解决pytorch 模型复制的一些问题
Mar 03 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,不用COM,生成excel文件
2006/10/09 PHP
从手册去理解分析PHP session机制
2011/07/17 PHP
twig模板常用语句实例小结
2016/02/04 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
深入探讨Vue.js组件和组件通信
2016/09/12 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
react项目如何使用iconfont的方法步骤
2019/03/13 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
电子商务专业个人的自我评价
2013/11/19 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
七一建党节演讲稿
2014/09/11 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技