Django Serializer HiddenField隐藏字段实例
作者:我就是全世界 发布时间:2022-10-29 02:39:07
标签: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',)
来源:https://blog.csdn.net/qq_40999403/article/details/81069598


猜你喜欢
- zabbix部署文档zabbix部署完之后zabbix-agent操作 1.监控mysql,首先要先安装mysql[root@lo
- 本文实例讲述了python获取文件后缀名及批量更新目录下文件后缀名的方法。分享给大家供大家参考。具体实现方法如下:1. 获取文件后缀名:#!
- 缘起最近复习设计模式拜读谭勇德的<<设计模式就该这样学>>该书以java语言演绎了常见设计模式本系列笔记拟采用gol
- <script language='javascript' for='document' event=
- 讨论Web开发技术的历史,当然要先说说Web的起源。众所周知,Web这个Internet上最热门的应用架构是由Tim Berners-Lee
- 我用的是mac mini然后在上边装好了sublime text2 插件依然是go sublime和go build这两个就不介绍了,因为之
- (1)更有意义的搜索 数据可被XML唯一的标识。没有XML,搜索软件必须了解每个数据库是如何构建的。这实际上是不可能的,因为每个数据库描述数
- 1.如何引入在vue-cli里,引入文件有几钟方法一种是用npm或者cnpm指令去下载对应的插件,然后在main.js里用import方法引
- 1.bisect模块概述bisect是python的内置模块, 用于有序序列的插入和查找。 插入的数据不会影响列表的排序, 但是原有列表需要
- SELECT语句具有种类繁多的各类选项,这些选项可以用来控制数据返回的方式。这些选项以子句、关键词和函数的形式存在。 子句是一种修改结果的语
- Base64是一种用64个字符来表示任意二进制数据的方法。用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文
- 我们在用Firefox上一些网站会看到这样的显示:现在时间是:108年1月26日而IE浏览器的话就显示正常的:现在时间是:2008年1月26
- MYSQL的profiling功能要在Mysql版本5.0.37以上才能使用。查看profile是否开启mysql> show var
- 终于皇天不负有心人,答案还是让我找到了。 网上的都是这样用的 $content = iconv("utf-8",&quo
- 引言年中购物618大狂欢开始了,各大电商又开始了大力度的折扣促销,我们的小胖又给大家谋了一波福利,淘宝APP直接搜索:小胖发福利,每天领取三
- 前言在golang语言中,select语句 就是用来监听和channel有关的IO操作,当IO操作发生时,触发相应的case动作。有了 se
- declare @name varchar(50)exec sp_executesql N'select @value=姓名 fro
- 各位工程师累了吗? 推荐一篇可以让你技术能力达到出神入化的网站"持久男"1.二维绘图a. 一维数据集用 Numpy nd
- SQL Server 2008的独到之处:安装SQL Server 2008的设置和安装也有所改进。配置数据和引擎位已经分开了,所以它使创建
- 我就废话不多说了,大家还是直接看代码吧!import kerasfrom keras.datasets import cifar10from