用户收藏主要就是涉及到了 权限问题
主要就是需要验证 用户是否登录 用户操作是否属于自己的范围
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']