Django 重定向以查看 kwarg 不工作

Django redirect to view with kwarg not working

我的目标是将客户端重定向到聊天会话详细信息视图,如果他们试图与他们已经聊天的人打开一个新的聊天会话。一切正常,但是当我尝试打开一个重复的聊天会话时,它没有被重定向,我得到的只是一个空白 json 响应

//views.py

class ChatSessionListView(generics.ListCreateAPIView):
serializer_class = ChatSessionSerializer
permission_classes = [permissions.IsAuthenticated]

def get_queryset(self):
    return ChatSession.objects.filter(Q(initiator=self.request.user) | Q(receiver=self.request.user))

def perform_create(self, serializer):
    receiver_username = self.request.data['username']
    receiver = get_object_or_404(User, username=receiver_username)
    chat_session = ChatSession.objects.filter(Q(initiator=self.request.user, receiver=receiver) | Q(initiator=receiver, receiver=self.request.user))
    if chat_session.exists():
        return redirect('v1:chat:chat_session_detail', session_id=chat_session[0].pk)
    else:
        serializer.save(initiator=self.request.user, receiver=receiver)

// urls.py

urlpatterns = [
path('', views.ChatSessionListView.as_view(), name='chat'),
path('<str:session_id>/', views.ChatSessionDetailView.as_view(), name='chat_session_detail')

]

您可以 return perform_create 中的 HTTP 响应。 perform_create 只应该使用序列化器数据创建一个新对象:它使用 request.data 创建一个序列化器,然后检查序列化器是否有效,然后执行创建。

您可以做的是覆盖 create 方法:

 class ChatSessionListView(generics.ListCreateAPIView):
    serializer_class = ChatSessionSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        return ChatSession.objects.filter(Q(initiator=self.request.user) | Q(receiver=self.request.user))

    def create(self, request, *args, **kwargs):
        receiver = get_object_or_404(User, username=self.request.data['username'])
        chat_sessions = ChatSession.objects.filter(
            Q(initiator=self.request.user, receiver=receiver) |
            Q(initiator=receiver, receiver=self.request.user)
        )
        chat_session = chat_sessions.first()
        if chat_session is None:
            serializer = ChatSessionSerializer(data=request.data)
            if serializer.is_valid():
              chat_session = serializer.save(initiator=self.request.user, receiver=receiver)        
       return redirect('v1:chat:chat_session_detail', session_id=chat_session.pk)