Django,GenericViewSet或Viewset中的自定义操作功能

时间:2019-11-03 05:14:05

标签: python django django-views django-generic-views django-rest-viewsets

我正在尝试实现基本的消息传递系统。 用户可以获得未读/已读/已发送的消息。这些路由中的每一个还返回不同的序列化json。所以我没有一个用于整个ViewSet的序列化器。

为此,我尝试实现ApiView,该操作不允许我创建自定义操作。 所以我尝试了Viewset,viewset从未命中get_serializer_class(我需要这样做,因为我需要返回不同的序列化模型。 所以我尝试了GenericViewSet,它似乎可以工作。但是由于get_queryset或queryset需要实现。我正在做以下事情。

我正在检查

中的操作
<p><span id="jsValue">unknown</span> is returned from the javascript function</p>
<p><button value="1">Set true</button> <button value="0">Set false</button></p>

其中一项动作就是这样

def get_queryset(self):

    if self.action is 'unread':
        return Message.objects.filter(recipient=user,recipient_deleted_at=None,read_at=None)
    elif self.action is 'recieved':
        return Message.objects.filter(recipient=user,recipient_deleted_at=None)
    elif self.action is 'sent':
        return Message.objects.filter(sender=user,recipient_deleted_at=None)

这很好用,但是我再次查询数据库两次,一次在未读操作中,一次在get_queryset函数中。 有没有办法从get_queryset函数访问返回的数据,所以我没有重新查询信息。

我的意思是,我可以破解get_query集合并只返回None并在操作中执行数据库操作,但这很丑陋。

长话短说,我是否想对这些Viewset / GenericViewset / ApiView进行更多介绍,并且正确的方法是基于函数的视图集。我只想将所有与消息传递相关的操作封装在一个类下。

1 个答案:

答案 0 :(得分:0)

所以基本上我没有设置get_queryset函数,而是设置了

queryset = Message.objects.all()

,在我的函数中,我将过滤器应用于self.queryset。由于在您实际使用它们之前不会评估这些查询集,因此效果很好。

def unread(self,request):
    user = self.request.user
    message_set=self.queryset.filter(recipient=user,recipient_deleted_at=None,read_at=None)
    serializer = MessageSerializerFlatList(message_set, many=True)
    return Response(serializer.data)