返回反向关系的序列化列表 - 当前用户投票的所有 object 个实例

Returning a serialized list of a reverse relation - all object instances voted upon by current user

我有用户 'favouriting' 内容和渠道,使用 django-vote。我想要 Django Rest Framework 中的端点视图,它将 return 当前 logged-in 用户投票(喜欢)的所有内容的(ContentSerializer)列表。

但是,虽然 django-vote 提供了一种方法来检索通过 content.likes.users() 对特定内容实例投票的用户列表,但它并没有提供一种方法来检索用户已投票的所有内容实例上。

我的理想结果是访问 /content/favourited/ 将使用 ContentSerializer 给出 json,其中列出了 content.likes.exists(user)True 的所有内容。我如何有效地做到这一点?

models.py

from django.db import models
from vote.managers import VotableManager

class Content(models.Model):
    # ... fields here
    likes = VotableManager()

views.py

class ContentViewSet(viewsets.ReadOnlyModelViewSet):
    """
    API endpoint that allows Content to be viewed
    """
    queryset = Content.objects.all()
    permission_classes = [AllowAny]
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = ContentFilter

    @list_route(permission_classes=[IsAuthenticated])
    def favourited(self, request):    
        """
        Returns a list of favourited content for the current logged-in user.
        """
        if request.user.is_authenticated():
            **DO SOMETHING**
            return **SOMETHING**

    @detail_route(permission_classes=[IsAuthenticated])
    def like(self, request, pk=None):
        """
        Toggles favourited "like" on content for the current logged-in user.
        """
        if request.user.is_authenticated():
            liked = self.get_object().likes.exists(request.user)
            if liked is False:
                self.get_object().likes.up(request.user)
                return Response({'status': 'liked'})
            elif liked is True:
                self.get_object().likes.down(request.user)
                return Response({'status': 'unliked'})
        else:
            return Response({'status': 'unauthenticated'})

    def get_serializer_class(self):
        # this will throw an error if using django rest swagger
        if self.action == 'list':
            return ContentSerializer
        if self.action == 'retrieve':
            return ContentDetailSerializer
        return ContentSerializer

另外,我想知道这个 "favourited content" 端点理想情况下应该在哪里——通过 request 识别 logged-in 用户,在 /content 下,或者在 /users 下使用 pk?

http://example.com/api-v1/users/1/favourited-content/

http://example.com/api-v1/content/favourited/ 

很高兴你喜欢django-vote。我合并了一个拉取请求,它添加了一个新的 api 以获得指定用户投票的所有实例。你现在可以在pypi上下载最新版本了