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)