If you use the ModelViewSet provided by Django Rest Framework you overwrite the perform_create method on the ModelViewSet to auto set the current user to the model before saving.
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = serializers.PostSerializer
def perform_create(self, serializer):
kwargs = {
'user': self.request.user # Change 'user' to you model user field.
}
serializer.save(**kwargs)
As usual my recommendation is to create “Mixin” like this one:
class UserCreateMixin(object):
"""
By default the user field is "user" you can change it
to your model "user" field.
Usage:
class PostViewSet(UserCreateMixin, viewsets.ModelViewSet):
# ViewsSet required info...
user_field = 'creator'
"""
user_field = 'user'
def get_user_field(self):
"""
You can dynamically change the user field
"""
return self.user_field
def perform_create(self, serializer):
kwargs = {
self.get_user_field(): self.request.user
}
serializer.save(**kwargs)
If you think that there is a better way, let us know in the comments bellow.