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