保存前编辑django-rest-framework序列化程序对象

use*_*839 39 python django serialization django-serializer django-rest-framework

我想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()
Run Code Online (Sandbox Code Playgroud)

如何使用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()
Run Code Online (Sandbox Code Playgroud)

Tom*_*tie 59

现在为REST框架3编辑

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

if serializer.is_valid():
    serializer.save(user_id=15)
Run Code Online (Sandbox Code Playgroud)

需要注意的是串行器也不会现在揭露过一个未保存的对象实例的serializer.object,但是你可以检查原始验证数据serializer.validated_data.

如果您正在使用通用视图并且想要修改保存行为,则可以使用perform_create和/或perform_update挂钩...

def perform_create(self, serializer):
    serializer.save(user_id=15)
Run Code Online (Sandbox Code Playgroud)

  • 在DRF 3.x中看起来已经变为`perform_create()`. (2认同)

zep*_*hyr 23

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

if serializer.is_valid():
    serializer.object.user_id = 15 # <----- this line
    serializer.save()
Run Code Online (Sandbox Code Playgroud)

  • `serializer.validated_data ['user_id'] = 15`适用于3.8.2 (6认同)
  • 序列化器对象没有属性“object”。 (6认同)