Django Serializer HiddenField隐藏字段实例

 更新时间:2020年03月31日 08:33:53   作者:我就是全世界  
这篇文章主要介绍了Django Serializer HiddenField隐藏字段实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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获取各操作系统硬件信息的方法

    这篇文章主要介绍了python获取各操作系统硬件信息的方法,实例分析了Python在windows、Linux及Mac等操作系统上获取CPU信息的相关技巧,需要的朋友可以参考下
    2015-06-06
  • pycharm创建临时文件scatch file的方法详解

    pycharm创建临时文件scatch file的方法详解

    JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,这篇文章主要介绍了pycharm创建临时文件scatch file的方法,需要的朋友可以参考下
    2024-07-07
  • python实现rar解压和压缩的方法(附源码)

    python实现rar解压和压缩的方法(附源码)

    数据量现在越来越大,压缩文件在日常生活中很常用,这篇文章主要给大家介绍了关于python实现rar解压和压缩的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • python3.6利用pyinstall打包py为exe的操作实例

    python3.6利用pyinstall打包py为exe的操作实例

    今天小编就为大家分享一篇python3.6利用pyinstall打包py为exe的操作实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 跟老齐学Python之有容乃大的list(1)

    跟老齐学Python之有容乃大的list(1)

    这一讲中的list类型,也是python的一种数据类型。翻译为:列表。LIST在python中具有非常强大的功能。
    2014-09-09
  • python爱心表白 每天都是浪漫七夕!

    python爱心表白 每天都是浪漫七夕!

    每天都是浪漫七夕!这篇文章主要为大家详细介绍了python爱心表白,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • python实现海螺图片的方法示例

    python实现海螺图片的方法示例

    这篇文章主要介绍了python实现海螺图片的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 详解Python的Flask框架中生成SECRET_KEY密钥的方法

    详解Python的Flask框架中生成SECRET_KEY密钥的方法

    密钥值的生成功能十分重要,几乎也是各大Web开发框架的标配,Flask当然也不例外,这里我们就来详解Python的Flask框架中生成SECRET_KEY密钥的方法
    2016-06-06
  • Python json解析库jsonpath原理及使用示例

    Python json解析库jsonpath原理及使用示例

    这篇文章主要介绍了Python json解析库jsonpath原理及使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Selenium操作隐藏的元素及问题解决方案

    Selenium操作隐藏的元素及问题解决方案

    这篇文章主要介绍了Selenium操作隐藏的元素及问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-12-12

最新评论