Django Rest在保存时将数据添加到序列化器

标签 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)

serializers.py
class MyModelSerializerCreate(serializers.ModelSerializer):

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

我想在request.user中将当前用户添加为所有者。
目前,我是通过直接与用户更新request.data,然后将更新的数据传递给我的序列化器,直接添加到我的 View 中。
    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)

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

最佳答案

您可以从序列化程序上下文中获取用户: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方法:
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模型进行特殊交互,则还可以覆盖deleteUser方法。

关于Django Rest在保存时将数据添加到序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42346200/

相关文章:

django - POST django rest 框架后重定向

java - 为什么我的类不可序列化?

java - 如何在GSON中使用@SerializedName备用字段来反序列化嵌套对象?

javascript - 从输入中获取文件列表

django - 非空唯一字段的默认值应该是什么

c# - 加载/保存数据的替代方法 - 无需序列化?

django - 使用 Django-taggit 和 django-taggit-serializer 有问题

python - Django REST Framework Web 登录不起作用

python - 每个 django 模型的函数

python - 如何检查 Django 1.3 项目是否也与 Django 1.6 兼容