django-resuful:用户收藏和权限 学习记录

用户收藏主要就是涉及到了 权限问题

主要就是需要验证 用户是否登录 用户操作是否属于自己的范围

class UserFavViewset(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
    """
    用户收藏功能
    """
    #不能获取全部
    # queryset = UserFav.objects.all()
    #IsAuthenticated 验证用户是否登录 IsOwnerOrReadOnly 用户只能操作属于自己的东西
    permission_classes = (IsAuthenticated,IsOwnerOrReadOnly)
    serializer_class = UserFavSerializer
    authentication_classes = (JSONWebTokenAuthentication,SessionAuthentication)
    lookup_field = 'goods_id' #以前是搜索的数据表本身id 这里就是使用goods_id进行搜索 不用数据表id
    def get_queryset(self):
        #获取属于用户的收藏list
        return UserFav.objects.filter(user=self.request.user)

IsOwnerOrReadOnly 官方文档中 有介绍

class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    Object-level permission to only allow owners of an object to edit it.
    Assumes the model instance has an `owner` attribute.
    """

    # 判断用户操作的对象 是否属于自己
    # 删除收藏 是否是自己的

    def has_object_permission(self, request, view, obj):
        # Read permissions are allowed to any request,
        # so we'll always allow GET, HEAD or OPTIONS requests.
        #看上面那句英文 如果是上面那些方法 就直接return True
        if request.method in permissions.SAFE_METHODS:
            return True

        # Instance must have an attribute named `owner`.
        return obj.user == request.user

serializer 序列化

class UserFavSerializer(serializers.ModelSerializer):
    # 获取当前用户 如果不定义 直接用model 中user字段 就会把所有用户都取出来
    user = serializers.HiddenField(
        default=serializers.CurrentUserDefault()
    )

    class Meta:
        model = UserFav
        # 唯一集合  不能重复操作   model 和serializer 只用配置一个
        validators = [
            UniqueTogetherValidator(
                queryset=UserFav.objects.all(),
                fields=('user', 'goods'),
                message="已经收藏"
            )
        ]
        fields = ['user', 'goods', 'id']
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,284评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,923评论 18 139
  • 在近十年期间,每次沈晨曦生病都会想起刚上大学时那次心有余悸的感冒。 一个人孤零零躺在伸手见五指漆黑的寝室,浑身滚烫...
    独立行走的鱼阅读 915评论 2 8
  • 今天跟大家讲讲基金怎么买,当然今天是介绍的场外基金。感兴趣的跟着板栗一起来看看吧。 首先打开天天基金网。 好了,先...
    假木风阅读 648评论 0 7
  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。在21世纪初,Dou...
    DX初学者阅读 1,752评论 0 0