How to set current user to user field in Django Rest Framework?

前端 未结 9 1981
后悔当初
后悔当初 2020-12-02 15:30

I have the following code working perfectly. I can create a Post object from DRF panel by selecting an image and a user. However I want DRF to populate the user

相关标签:
9条回答
  • 2020-12-02 16:01

    You can avoid passing the user in your request and you won't see it in the output but DRF will populate it automatically:

    from rest_framework import serializers
    
    class MyModelSerializer(serializers.ModelSerializer):
        user = serializers.HiddenField(default=serializers.CurrentUserDefault())
    
        class Meta:
            model = models.MyModel
            fields = (
                'user',
                'other',
                'fields',
            )
    
    0 讨论(0)
  • 2020-12-02 16:03

    @DaveBensonPhillips's answer might work in your particular case for some time, but it is not very generic since it breaks OOP inheritance chain.

    ListCreateAPIView inherits from CreateModelMixin which saves the serializer already. You should always strive to get the full chain of overridden methods executed unless you have a very good reason not to. This way your code stays DRY and robust against changes:

    class PhotoListAPIView(generics.ListCreateAPIView):
        ...
        def perform_create(self, serializer):
            serializer.validated_data['user'] = self.request.user
            return super(PhotoListAPIView, self).perform_create(serializer)
    
    0 讨论(0)
  • 2020-12-02 16:04

    As of DRF version 3.8.0 (Pull Request discussion), you can override save() in serializer.

    from rest_framework import serializers
    ...
    
    class PostSerializer(serializers.ModelSerializer):
        user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
    
        class Meta:
            model = Post
            fields = ['id', 'user', 'photo']
    
        def save(self, **kwargs):
            """Include default for read_only `user` field"""
            kwargs["user"] = self.fields["user"].get_default()
            return super().save(**kwargs)
    
    0 讨论(0)
提交回复
热议问题