Is it possible to get the current user in a model serializer? I'd like to do so without having to branch away from generics, as it's an otherwise simple task that must be done.
My model:
class Activity(models.Model):
number = models.PositiveIntegerField(
blank=True, null=True, help_text="Activity number. For record keeping only.")
instructions = models.TextField()
difficulty = models.ForeignKey(Difficulty)
categories = models.ManyToManyField(Category)
boosters = models.ManyToManyField(Booster)
class Meta():
verbose_name_plural = "Activities"
My serializer:
class ActivitySerializer(serializers.ModelSerializer):
class Meta:
model = Activity
And my view:
class ActivityDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Activity.objects.all()
serializer_class = ActivityDetailSerializer
How can I get the model returned, with an additional field user
such that my response looks like this:
{
"id": 1,
"difficulty": 1,
"categories": [
1
],
"boosters": [
1
],
"current_user": 1 //Current authenticated user here
}
I modified the request.data:
I found the answer looking through the DRF source code.
The key is the fact that methods defined inside a
ModelSerializer
have access to their own context, which always includes the request (which contains a user when one is authenticated). Since my permissions are for only authenticated users, there should always be something here.This can also be done in other built-in djangorestframework serializers.
As Braden Holt pointed out, if your
user
is still empty (ie_user
is returningNone
), it may be because the serializer was not initialized with the request as part of the context. To fix this, simply add the request context when initializing the serializer:A context is passed to the serializer in REST framework, which contains the request by default. So you can just use
self.context['request'].user
inside your serializer.