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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我就是全世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值