Django перенаправление на представление с помощью kwarg не работает
Моя цель - перенаправить клиента на детальное представление сеанса чата, если он пытается открыть новый сеанс чата с кем-то, с кем у него уже есть сеанс чата. Все работает нормально, но когда я попытался открыть дубликат сеанса чата, он не был перенаправлен, и все, что я получил, это пустой 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')
]
Вы можете не возвращать HTTP-ответ в perform_create
. 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)