Django, функции пользовательских действий в GenericViewSet или Viewset - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь внедрить базовую систему обмена сообщениями. Пользователь может получать непрочитанные / прочитанные / отправленные сообщения. Каждый из этих маршрутов также возвращает разные сериализованные 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, и это правильный путь, это наборы функций на основе. Я просто хотелинкапсулировать все связанные с обменом сообщениями операции в одном классе.

1 Ответ

0 голосов
/ 03 ноября 2019

Таким образом, в основном вместо реализации функции 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)
...