Я пытаюсь внедрить базовую систему обмена сообщениями. Пользователь может получать непрочитанные / прочитанные / отправленные сообщения. Каждый из этих маршрутов также возвращает разные сериализованные jsons. Поэтому у меня нет одного сериализатора для всего ViewSet.
Для этого я попытался реализовать ApiView, который не позволяет мне создавать пользовательские действия. Поэтому я попробовал Viewset, viewset никогда не попадет в get_serializer_class (мне это нужно, так как мне нужны разные возвращенные сериализованные модели. Поэтому я попробовал GenericViewSet, который, кажется, работает. Но так как необходимо реализовать get_queryset или queryset. Я делаю следующее.
Я проверяю действие в
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)
И одно из действий похоже на это
def unread(self,request):
user = self.request.user
message_set=Message.objects.filter(recipient=user,recipient_deleted_at=None,read_at=None)
serializer = MessageSerializerFlatList(message_set, many=True)
return Response(serializer.data)
Это прекрасно работает, но я снова обращаюсь к БД дважды, один в непрочитанномдействие, а также один раз в функции get_queryset. Есть ли способ получить доступ к возвращенным данным из функции get_queryset, поэтому мне не нужно повторно запрашивать информацию.
Я имею в виду, что могу взломать набор get_query и просто вернуть None иделаю мои операции с БД в действиях, но это уродливо.
Короче говоря, я прошу многое из этих Viewset / GenericViewset / ApiView, и это правильный путь, это наборы функций на основе. Я просто хотелинкапсулировать все связанные с обменом сообщениями операции в одном классе.