Django REST Framework,pre_save()和serializer.is_valid(),它们如何工作?

jmi*_*ela 11 python django rest django-rest-framework

我需要将用户附加到请求中,这似乎是一件相当普遍的事情,但事实证明这几乎是不可能的.

Django REST框架的文档建议使用序列化程序类的pre_save方法,我做了,但是当调用serializer.is_valid()时它不会被调用,这使得它没有价值,因为没有用户字段串行器验证失败.

我已经看到了一些建议,但它们看起来像疯狂的黑客和/或不起作用.另外,我觉得这是一个太常见的任务,真正需要我看到人们建议的所有东西.我不能成为唯一需要将用户附加到REST请求中创建的对象的人.

Nin*_*ker 5

假设您正在使用此处描述的身份验证机制之一(或Django Auth):

http://django-rest-framework.org/api-guide/authentication.html,你有一个

request.user 宾语.

创建序列化程序时,在实例化时将其从请求中拉出/传入.

MySerializer(data={"user": request.user, "otherField"=... })
Run Code Online (Sandbox Code Playgroud)

如果你这样做:

MySerializer(data=request.DATA)
Run Code Online (Sandbox Code Playgroud)

您需要复制request.DATA对象:

from django.utils.datastructures import MultiValueDict
...
data = MultiValueDict(request.DATA)
data['user'] = request.user
MySerializer(data=data)
Run Code Online (Sandbox Code Playgroud)


jmi*_*ela 2

事实证明,问题是我使用 ListAPIView 作为视图类的基类,并且它没有定义 pre_save 方法。当我添加一些定义了它的 mixins 时,一切都开始工作。

看起来很奇怪,很多基本教程中使用的东西不支持这样的基本功能,但是生活和学习。