11

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

Django REST Framework 的文档建议使用序列化程序类的 pre_save 方法,我这样做了,但是在调用 serializer.is_valid() 时它不会被调用,这使得它变得毫无价值,因为没有用户字段序列化程序验证失败。

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

4

5 回答 5

5

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

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

request.user目的。

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

MySerializer(data={"user": request.user, "otherField"=... })

如果你正在做:

MySerializer(data=request.DATA)

您需要复制request.DATA对象:

from django.utils.datastructures import MultiValueDict
...
data = MultiValueDict(request.DATA)
data['user'] = request.user
MySerializer(data=data)
于 2013-11-15T07:54:25.373 回答
4

pre_saveis_valid在实例保存到数据库之后但之前调用。您需要覆盖验证(def get_validation_exclusions(self):在该用户序列化程序字段上使用,因为您将在 中修复验证问题pre_save。请参阅我之前的答案:

Django REST Framework 序列化程序字段必需=false

我向 DRF 的作者提出了这个问题,他们将研究一个更可行的解决方案。

于 2013-11-19T06:08:35.050 回答
2

原来问题是我使用 ListAPIView 作为我的视图类的基类,它没有定义 pre_save 方法。当我添加一些定义了它的 mixin 时,一切都开始工作了。

似乎很奇怪,许多基础教程中使用的东西不支持这样的基本功能,而是生活和学习。

于 2014-03-20T19:12:19.810 回答
1

此问题的最佳解决方案是将填充的必填字段标记pre_saveread_only_fields在序列化程序中。

为此,请将以下内容添加到序列化程序类中:

class MySerializer(serializers.ModelSerializer):
    ...
    class Meta:
        ...
        read_only_fields = ['user', 'my_other_field', ...]
于 2014-09-11T21:50:54.300 回答
1

在新版本的 DRF (3.x) 中,pre_save 被替换为 perform_createand perform_update参考

于 2017-07-28T01:18:42.747 回答