Djangoがkwargが機能していない状態で表示するようにリダイレクトします

2
2022.01.14

私の目標は、すでにチャットセッションを持っている人と新しいチャットセッションを開こうとしている場合は、クライアントをチャットセッションの詳細ビューにリダイレクトすることです。すべてがうまく動作しますが、重複したチャットセッションを開こうとすると、リダイレクトされず、私が得たものはすべて空白の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')

]

回答
3
2022.01.14

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)