保存前修改对象并将其传递给序列化程序

时间:2014-04-04 15:28:12

标签: django django-rest-framework

我正在尝试在保存用户想要插入的对象之前设置一些字段。例如,如果用户想要创建新实例,则在保存之前,我想将 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解决方案是正确的方法还是我错过了什么?

提前致谢。

1 个答案:

答案 0 :(得分: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/