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']

你可能感兴趣的:(django-resuful:用户收藏和权限 学习记录)