【问题标题】:Modify object before save and passing it to serializer在保存之前修改对象并将其传递给序列化程序
【发布时间】:2014-04-04 15:28:11
【问题描述】:

我试图在保存用户想要插入的对象之前设置一些字段。例如,如果用户想创建一个新实例,在保存它之前,我想将字段 owner 设置为 request.user,然后从父级调用 create 方法。我通过以下代码实现了这一点:

class ClassView(viewsets.ModelViewSet):
    queryset = ModelClass.objects.all()
    serializer_class = ModelClassSerializer

    def create(self, request, pk = None):
        if ModelClass.objects.filter(pk = request.user.id):
            return Response({'detail' : "This user is already inserted" }, status = status.HTTP_401_UNAUTHORIZED)
        return super(ClassView, self).create(request, pk = None)

    def pre_save(self, obj):
        obj.user_id = ModelClass.objects.get(pk = self.request.user.id)

也可能是我想根据一些来自 POST 请求的值的计算来设置模型的属性(这些值在序列化程序中作为字段建立)。

pre_save 解决方案是正确的方法还是我错过了什么?

提前致谢。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我会说这是正确的方法,但如果您只是想将对象的用户设置为当前请求用户,而不是:

    obj.user_id = ModelClass.objects.get(pk = self.request.user.id)
    

    ...只需使用:

    obj.user = self.request.user
    

    其余框架 pre_save 钩子可以满足您的确切要求,但还有其他一些您可能会觉得有用的钩子。请参阅http://www.django-rest-framework.org/api-guide/generic-views#genericapiview - 在保存/删除挂钩下。

    但是,如果您需要将此数据保存在其余框架之外的对象实例上(即另外在普通 Django 视图中),您很可能希望使用 Django pre_save 信号并将您的模型连接到它。这样每次保存对象时都会存储请求用户,而不仅仅是通过其余框架:https://docs.djangoproject.com/en/dev/ref/signals/

    【讨论】:

    • 我没有使用self.request.user,因为我使用的用户实例是从 auth.User 类继承的子类,我需要子类(无论如何这不是问题,但感谢评论)。好吧,谢谢你的回答。
    猜你喜欢
    • 2014-10-20
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2022-01-17
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多