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字符串,数值计算
Oct 05 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
python实现简单神经网络算法
Mar 10 Python
详解Python中的四种队列
May 21 Python
pandas带有重复索引操作方法
Jun 08 Python
python实现对csv文件的列的内容读取
Jul 04 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
Python decimal模块使用方法详解
Jun 08 Python
详解Python中list[::-1]的几种用法
Nov 16 Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 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
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
php 禁止页面缓存输出
2009/01/07 PHP
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
2013/07/05 PHP
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
php算法实例分享
2015/07/14 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
向左滚动文字 js代码效果
2013/08/17 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
React应用中使用Bootstrap的方法
2017/08/15 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
JS运算符优先级与表达式示例详解
2020/09/04 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
彪马英国官网:PUMA英国
2019/02/11 全球购物
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
追悼会上的答谢词
2014/01/10 职场文书
个人求职信范文分享
2014/01/31 职场文书
空气环保标语
2014/06/12 职场文书