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中的多重继承实例讲解
Sep 28 Python
python实现批量监控网站
Sep 09 Python
Python操作MySQL模拟银行转账
Mar 12 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
Dec 15 Python
Python进阶之自定义对象实现切片功能
Jan 07 Python
对python_discover方法遍历所有执行的用例详解
Feb 13 Python
python+os根据文件名自动生成文本
Mar 21 Python
Python如何使用队列方式实现多线程爬虫
May 12 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
Python实现EM算法实例代码
Oct 04 Python
python语言time库和datetime库基本使用详解
Dec 25 Python
python全面解析接口返回数据
Feb 12 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命名空间简单用法示例
2018/12/28 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
面向对象设计模式的核心法则
2013/11/10 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
python中mechanize库的简单使用示例
2014/01/10 Python
详解Python当中的字符串和编码
2015/04/25 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
Python数据可视化之画图
2019/01/15 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
什么是python的id函数
2020/06/11 Python
python爬虫 requests-html的使用
2020/11/30 Python
python 模拟登录B站的示例代码
2020/12/15 Python
python matlab库简单用法讲解
2020/12/31 Python
孕妇装中的著名品牌:Isabella Oliver(伊莎贝拉·奥利弗)
2016/10/31 全球购物
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
为什么会有内存对齐
2016/10/10 面试题
创建索引时需要注意的事项
2013/05/13 面试题
小学体育教学反思
2014/01/31 职场文书
项目采购员岗位职责
2014/04/15 职场文书
文化产业实施方案
2014/06/07 职场文书
音乐教师个人总结
2015/02/06 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python