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实现的检测网站挂马程序
Nov 30 Python
Python中的浮点数原理与运算分析
Oct 12 Python
Python3 replace()函数使用方法
Mar 19 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 Python
python制作图片缩略图
Apr 30 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
Python类反射机制使用实例解析
Dec 30 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
python实现语音常用度量方法的代码详解
May 25 Python
Python MNIST手写体识别详解与试练
Nov 07 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项目的方法
2006/10/09 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
PHP 验证身份证是否合法的函数
2017/02/09 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
Javascript 继承机制实例
2009/08/12 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
浅析Python中的序列化存储的方法
2015/04/28 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
python解析xml简单示例
2019/06/21 Python
python实现大文本文件分割
2019/07/22 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
Python模块的制作方法实例分析
2019/12/21 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
人事档案接收函
2014/01/12 职场文书
招聘与培训专员岗位职责
2014/01/30 职场文书
《海底世界》教学反思
2014/04/16 职场文书
小英雄雨来观后感
2015/06/09 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书