Обычно при переходе по URL-адресу http://localhost:8000/api/v1/public_profiles/ с использованием ModelViewSet я получаю только форму POST, а при переходе к определенному ресурсу, например http://localhost:8000/api/v1/public_profiles/123456/, я получаю только форму PUT / PATCH , В настоящее время обе формы отображаются в обоих местах.
Для многих моих маршрутов мне потребуется больше контроля над моими видами, поэтому я переключился на общие виды. Я также хотел воспользоваться преимуществами маршрутизатора, поэтому я использовал общий вид. Изображение выше является результатом реализации следующего вида:
class PublicProfileViewSet(viewsets.GenericViewSet, generics.ListCreateAPIView, generics.RetrieveUpdateAPIView):
queryset = PublicProfile.objects.all()
def get_serializer_class(self):
if self.action == 'list':
return PublicProfileReadSerializer
elif self.action == 'retrieve':
return PublicProfileReadSerializer
elif self.action == 'create':
return PublicProfileCreateSerializer
elif self.action == 'update':
return PublicProfileUpdateSerializer
else:
return PublicProfileReadSerializer
Могу ли я что-нибудь сделать, чтобы исправить это, чтобы форма POST отображалась в действии LIST, а форма PUT / PATCH - в действии RETRIEVE?
Одна вещь, которую я попробовал, - это использовать ViewSet, но тогда я не получаю сгенерированные формы, потому что нет 'serializer_class':
class PublicProfileViewSet(viewsets.ViewSet):
def list(self, request):
queryset = PublicProfile.objects.all()
serializer = PublicProfileReadSerializer(queryset, many=True, context={'request': request})
return Response(serializer.data)
def retrieve(self, request, pk=None):
queryset = PublicProfile.objects.all()
public_profile = get_object_or_404(PublicProfile, pk=pk)
serializer = PublicProfileReadSerializer(public_profile, context={'request': request})
return Response(serializer.data)
def create(self, request):
serializer = PublicProfileCreateSerializer(data=request.data, context={'request': request})
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
def update(self, request, pk=None):
instance = get_object_or_404(PublicProfile, pk=pk)
serializer = PublicProfileUpdateSerializer(instance, data=request.data, context={'request': request})
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
def partial_update(self, request, pk=None):
instance = get_object_or_404(PublicProfile, pk=pk)
serializer = PublicProfileUpdateSerializer(instance, data=request.data, context={'request': request}, partial=True)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
def destroy(self, request, pk=None):
instance = get_object_or_404(PublicProfile, pk=pk)
instance.user.is_active = False
instance.user.save()
return Response(status=status.HTTP_200_OK)