Skip to main content

判断是否收藏电影接口实现

在电影详情页中,我们希望能够显示当前用户是否已经收藏了该电影。如下图所示。

图53-显示收藏状态

图53-收藏状态

为了实现这个功能,我们需要添加一个新的接口用来判断用户是否已经收藏了指定的电影。

添加action接口

在我们的Viewset中,有create, destroy, list等方法,并没有显示收藏状态的接口,所以我们可以通过添加一个名为is_collected的action方法来实现判断是否收藏的功能。例如,我们想创建一个接口,像下图一样。

图53-判断收藏状态接口

首先,导入action装饰器:

from rest_framework.decorators import action

然后,在要添加接口的方法上使用@action装饰器,并设置detail=True参数来表示这个接口是针对单一资源的:

dx_movie/account/views.py
    @action(detail=True, methods=['get'])
def is_collected(self, request, pk=None):
user = request.user
profile = Profile.objects.get(user=user)
movie = Movie.objects.get(id=pk)
is_collected = profile.movies.filter(id=movie.id).exists()
return Response({'is_collected': is_collected})

在这里,我们设置了一个名为is_collected的接口,其URL模式为/movies/{id}/is_collected/。请求方式为GET。

代码解析
  1. 装饰器:使用@action装饰器标记这是一个自定义动作,其中detail=True指明这个动作应用于具体某个实例上而不是整个集合。methods=['get']表明这个动作通过HTTP GET请求访问。
  2. 方法定义def is_collected(self, request, pk=None)定义了is_collected方法,它接受当前的HTTP请求对象request和一个主键pk参数,用来指定要检查的电影ID。
  3. 获取用户和个人资料user = request.user获取当前登录的用户。接下来,profile = Profile.objects.get(user=user)通过当前用户获取其对应的个人资料(Profile)实例。
  4. 获取电影实例movie = Movie.objects.get(id=pk)通过传入的电影ID(pk),从数据库中检索出对应的电影实例。
  5. 检查电影是否已被收藏is_collected = profile.movies.filter(id=movie.id).exists()检查当前用户的个人资料中关联的电影集合(假设这里Profile模型与Movie模型之间有某种形式的关系,如多对多)里是否存在具有指定ID的电影。exists()方法返回一个布尔值,表明是否找到了匹配的电影。
  6. 返回响应return Response({'is_collected': is_collected})将检查结果包装在一个字典中,作为JSON响应返回。如果电影已被当前用户收藏,则is_collectedTrue,否则为False

测试接口

现在,我们可以使用请求工具测试一下这个接口了。发送GET请求到/movies/{id}/is_collected/,并在Authorization头部中添加正确的JWT令牌。

  • 如果用户已经收藏了指定电影,接口将返回{"is_collected": true}
  • 如果用户未收藏该电影,接口将返回{"is_collected": false}

如果用户已经收藏一部电影,接口效果如下图所示。 图53-判断已经收藏接口

以上就是关于判断是否收藏电影接口实现的内容。