django rest保存时将数据添加到序列化程序

v.t*_*rey 6 django serialization django-rest-framework

我想做以下事情:

models.py

class MyModel(TimeStampedModel, models.Model):
    name = models.CharField(max_length=100)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)

serializers.py

class MyModelSerializerCreate(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = (
            'name',
        )
Run Code Online (Sandbox Code Playgroud)

我想添加当前用户的所有者request.user.目前我在我的视图中通过向用户提升request.data直接添加它,然后将更新的数据传递给我的序列化程序.

    data = request.data
    # Add owner to data
    data["owner"] = request.user.pk
    serializer = self.get_serializer(data=data)
    serializer.is_valid(raise_exception=True)
    self.perform_create(serializer)
    headers = self.get_success_headers(serializer.data)
Run Code Online (Sandbox Code Playgroud)

我想直接在我的序列化程序中执行此操作,但无法找到正确执行此操作的方法,因为它看起来像是对我进行数据验证.这是一个好主意吗 ?我应该将这个逻辑保留在我的视图中还是将其移动到我的序列化程序中?

Iva*_*kin 11

您可以从序列化程序上下文中获取用户:

self.context['request'].user
它从get_serializer_context最初在以下位置创建的方法传递GenericAPIView:

class GenericAPIView(APIView):
    ....
    def get_serializer_context(self):
        """
        Extra context provided to the serializer class.
        """
        return {
            'request': self.request,
            'format': self.format_kwarg,
            'view': self
        }  
Run Code Online (Sandbox Code Playgroud)

在序列化程序中,您需要覆盖一个create方法:

class MyModelSerializerCreate(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = ('name', )

    def create(self, validated_data):
        validated_data['owner'] = self.context['request'].user
        return super(MyModelSerializerCreate, self).create(validated_data)
Run Code Online (Sandbox Code Playgroud)

如果需要与模型进行一些特殊交互,也可以覆盖updatedelete方法user.

  • @IvanSemochkin我有同样的问题,但是您的回答对我不起作用。我基本上想做:`def perform_create(self,serializer):serializer.save(user = self.request.user)`但是,如果我回答了我,就会得到错误:`“ user”:[“该字段是需要。” ]` (2认同)