Django Rest在保存时将数据添加到序列化器 [英] django rest add data to serializer when saving

查看:128
本文介绍了Django Rest在保存时将数据添加到序列化器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想执行以下操作:

models.py

models.py

class MyModel(TimeStampedModel, models.Model):
    name = models.CharField(max_length=100)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL)

serializers.py

serializers.py

class MyModelSerializerCreate(serializers.ModelSerializer):

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

我想在 request.user 中将当前用户添加为所有者。
当前,我是通过直接与用户更新request.data,然后将更新的数据传递给我的序列化程序直接添加到我的视图中。

And I would like to add as owner the current user in request.user. Currently I am adding this in my view directly by uptading request.data with user and then pass the updated data to my serializer.

    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)

我想直接在序列化程序中执行此操作,但是找不到合适的方法,因为它对我来说就像是数据验证。这是一个好主意吗 ?我应该保留这种逻辑还是将其移到序列化器中?

I would like to do this in my serializer directly but can't find a way to properly do it because it looks like data validation to me. Is this a good idea ? Should I keep this logic in my views or move it to my serializer ?

推荐答案

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

You can get a user from serializer context:

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
        }  

在序列化程序内,您需要覆盖 create 方法:

Inside a serializer you need to override a create method:

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)

如果需要,您还可以覆盖 update delete 方法与 user 模型的一些特殊交互。

You could also override an update and delete methods if you need some special interactions with user model.

这篇关于Django Rest在保存时将数据添加到序列化器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆