Alexander Khoroshavin
Alexander Khoroshavin

Reputation: 162

How to dispatch request to some view depending on http method?

I have Post django model:

class Post(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()

Serializers:

class PostListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('id', 'title')

class PostDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'

Views:

class PostListView(generics.ListAPIView):
    queryset = Post.objects.all()
    serializer = PostListSerializer

class CreatePostView(generics.CreateAPIView):
    queryset = Post.objects.all()
    serializer = PostDetailSerializer
    permission_classes = (permissions.IsAuthenticated,)

Endpoint is /api/posts/

How to dispatch request to PostListView if HTTP Method is GET and to CreatePostView if HTTP Method is POST?

Upvotes: 0

Views: 109

Answers (1)

Sayse
Sayse

Reputation: 43300

You don't, instead of writing permission_classes and serializer use the get_serializer_class and get_permissions methods

def get_serializer_class(self):
    if self.request.method == 'GET':
        return PostListSerializer
    return PostDetailSerializer

def get_permissions(self):
    if self.request.method == 'GET':
        return [IsAuthenticated()]
    return []

alternatively, consider if you're expecting too much for the single endpoint

Upvotes: 1

Related Questions