在保存前编辑 Django-Rest-Framework 序列化对象

56

我想在保存之前编辑django-rest-framwork序列化对象。这是我目前的做法 -

def upload(request):
    if request.method == 'POST':
        form = ImageForm(request.POST, request.FILES)
        if form.is_valid(): # All validation rules pass
             obj = form.save(commit=False)
             obj.user_id = 15
             obj.save()

我如何使用 django-rest-framework 的序列化对象来实现它?

@api_view(['POST','GET'])
def upload_serializers(request):
    if request.method == 'POST':
         serializer = FilesSerializer(data=request.DATA, files=request.FILES)
         if serializer.is_valid():
              serializer.save()

你的第一段似乎不完整。“This how I do it with” 后面是什么? - Donal Fellows
3个回答

78

现在已经更新为REST框架3

使用REST框架3的模式现在是:

if serializer.is_valid():
    serializer.save(user_id=15)
请注意,序列化器现在永远不会将未保存的对象实例暴露为serializer.object,但是您可以检查原始验证数据作为serializer.validated_data。如果您正在使用通用视图并且想要修改保存行为,则可以使用perform_create和/或perform_update钩子...
def perform_create(self, serializer):
    serializer.save(user_id=15)

2
在DRF 3.x中,它似乎已更改为perform_create() - nnyby
1
提示:在 perform_create() 方法内,您可以访问 self.requestself.argsself.kwargs - Karim Sonbol
1
当我们需要条件修改时,这是不能使用的。 - Iqbal

34

在保存序列化程序之前,您可以编辑序列化程序的对象:

if serializer.is_valid():
    serializer.object.user_id = 15 # <----- this line
    serializer.save()

1
可以修改嵌套对象吗? serializer.object.book.author_id = 22 - Amogh Talpallikar
12
serializer.validated_data['user_id'] = 15 可以在3.8.2版本中使用。该语句将给validated_data字典中的'user_id'键设置值为15。 - Iqbal
11
序列化器对象没有 'object' 属性。 - Alex78191

0

在需要在验证之前修改数据的情况下,还有另一种选项,无需重写函数createperform_create。只需在序列化器类上使用to_internal_value函数:

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
    def to_internal_value(self, data):
        data['field1'] = "new value for field 1"
        data['field2'] = "new value for field 2"
        data['field3'] = "new value for field 3"
        return super().to_internal_value(data)

因此,在进行验证之前,我们可以修改数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接