0

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.

Henrik
  • 1,983
  • 3
  • 28
  • 52

2 Answers2

4

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).

suselrd
  • 734
  • 4
  • 10
  • Hi, I added this to my ItemViewSet try this but still gets "owner_id cannot be null". I've changed my code above to reflect this. – Henrik Jun 02 '15 at 19:53
  • 1
    You should add a permission class to your viewset, that enforces the user to be authenticated to access it. Otherwise, self.request.user could be an anonymous user... – suselrd Jun 04 '15 at 14:25
0

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
Henrik
  • 1,983
  • 3
  • 28
  • 52