Drem Edys
Drem Edys

Reputation: 133

How to declare author to current user in Model serializer?

I have Post model:

class Post(models.Model):
    title = models.CharField(max_length=50)
    text = models.CharField(max_length=1000)
    published_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

And a view:

@api_view(['GET', 'POST'])
def posts(request):
    if request.method == 'GET':
        post_list = Post.objects.all()
        serializer = PostSerializer(post_list, many=True)
        return Response(serializer.data)
    elif request.method == 'POST':
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        
        return Response(serializer.errors)

And serializer:

class PostSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    author = UserSerializer(read_only=True)
    category = CategorySerializer(read_only=True)
    author_id = serializers.IntegerField(write_only=True)
    category_id = serializers.IntegerField(write_only=True)

    class Meta:
        model = Post
        fields = ('id', 'title', 'text', 'published_date', 'author', 'category', 'category_id', 'author_id')

I want to send POST request like {"title":"some title", "text":"some text", "category_id"=1}, so that author_id will be automatically current user id. How can I do this?

Upvotes: 0

Views: 490

Answers (1)

Aprimus
Aprimus

Reputation: 1551

In the view, pass the current user to serializer.save() during the POST.

def posts(request):
    if request.method == 'GET':
        post_list = Post.objects.all()
        serializer = PostSerializer(post_list, many=True)
        return Response(serializer.data)
    elif request.method == 'POST':
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(author=request.user)
                              ^^^
            return Response(serializer.data)
        
        return Response(serializer.errors)

Upvotes: 1

Related Questions