我正在尝试实现基本的消息传递系统。 用户可以获得未读/已读/已发送的消息。这些路由中的每一个还返回不同的序列化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进行更多介绍,并且正确的方法是基于函数的视图集。我只想将所有与消息传递相关的操作封装在一个类下。
答案 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)