Django Rest Framework:请求中值的默认外键
Django Rest Framework: Default foreign key to value from request
A User 属于 Office。 用户 可以创建 联系人。 联系人 属于 办公室。
我希望联系人的 office_id 默认为当前用户的办公室。
目前,我这样做的方式是重写 ModelViewSet 创建方法:
在我的views.py
def create(self, request):
contact_data = request.data
contact_data['office'] = request.user.userprofile.office.id # This is the only line I added
serializer = self.get_serializer(data=contact_data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
但是这种方法感觉不太对,而且它的作用有很多代码。知道如何以更好的方式实现这一点吗?
你可以勾选 .perform_create
:
def perform_create(self, serializer):
serializer.save(office=self.request.user.userprofile.office.id)
但您可能还必须将 serializer
中的 office
字段更改为 required=False
以使其通过 .is_valid
.
另一种解决方案是更改 request.data
然后调用 create
方法:
def create(self, request, *args, **kwargs):
request.data['office'] = request.user.userprofile.office.id
return super(ViewClassName, self).create(request, *args, **kwargs)
A User 属于 Office。 用户 可以创建 联系人。 联系人 属于 办公室。
我希望联系人的 office_id 默认为当前用户的办公室。
目前,我这样做的方式是重写 ModelViewSet 创建方法:
在我的views.py
def create(self, request):
contact_data = request.data
contact_data['office'] = request.user.userprofile.office.id # This is the only line I added
serializer = self.get_serializer(data=contact_data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
但是这种方法感觉不太对,而且它的作用有很多代码。知道如何以更好的方式实现这一点吗?
你可以勾选 .perform_create
:
def perform_create(self, serializer):
serializer.save(office=self.request.user.userprofile.office.id)
但您可能还必须将 serializer
中的 office
字段更改为 required=False
以使其通过 .is_valid
.
另一种解决方案是更改 request.data
然后调用 create
方法:
def create(self, request, *args, **kwargs):
request.data['office'] = request.user.userprofile.office.id
return super(ViewClassName, self).create(request, *args, **kwargs)