Reputation: 1995
I'm trying to POST a "record" using Django REST. I want Django to automagically set the user id from the logged in user.
views.py:
class ItemViewSet(viewsets.ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
serializers.py:
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ('id', 'created', 'owner', 'desc')
read_only_fields = ('owner',)
models.py:
class Item(models.Model):
created = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey('appserver.MyUser', related_name='appserver')
desc = models.CharField(max_length=100, blank=True, default='')
I am using EmailAbstractUser from django-rest-authemail 0.1.4:
views.py:
class MyUser(EmailAbstractUser):
date_of_birth = models.DateField('Date of birth', null=True, blank=True)
objects = EmailUserManager()
Any help appreciated.
Upvotes: 0
Views: 3462
Reputation: 1995
OK I actually solved this myself:
In the ItemSerializer in serializers.py:
owner = serializers.Field(source='owner.id')
In Item in models.py
owner = models.ForeignKey(MyUser)
In ItemViewSet in views.py:
def pre_save(self, obj):
obj.owner = self.request.user
Upvotes: 0
Reputation: 794
You can overwrite the perform_create method in your ItemViewSet, something like this:
def perform_create(self, serializer):
return serializer.save(owner=self.request.user)
If you want to set this attribute to the requesting user, only at creation time, you will be set now. But, if you want to re-set the owner at updating time too, you'll have to overwrite the perform_update method too (in the same way).
Upvotes: 4