我使用mixins.CreateModelMixin.create
创建对象,但是我还需要向其中的request.user
字段添加m2m
。因此,我的想法是从self.create()
捕获对象,而不是最终make obj.users.add(user)
捕获对象。但是CreateModelMixin仅返回responce
。如何从.create
获取对象?这是添加用户的更好方法吗?我可以使用super
(不好用)吗?谢谢!
添加:
我可以在这里使用perform_create()
并捕获对象,但是它会使代码更大并大部分重复.create()
,所以我认为这不是正确的方法。
添加:
我现在使用的代码:
@action(detail=False, methods=['POST'], serializer_class=CompanyAdminSerializer)
def create_company(self, request):
user = self.request.user
if user.user_of_company.exists():
raise NotAcceptable(detail='Only one company allowed')
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
company = serializer.save()
company.users.add(user)
company.admin_users.add(user)
return Response(serializer.data)
答案 0 :(得分:1)
要从create
捕获实例,您将必须重写create
方法。
最简单的方法是重写perform_create
方法。
.save()
返回创建的对象的实例。 source
您的代码将如下所示:
#Assuming you're using CreateAPIView
class New_Create(CreateAPIView):
def perform_create(self, serializer):
obj = serializer.save()
#Adding to M2M
obj.users.add(self.request.user)
DRF串行器不支持开箱即用的M2M create/update。
编辑:
我不建议覆盖create
方法。已创建perform_create
方法来实现此目的。您只能在调用.save()
之后访问实例。因此,在序列化器上调用.save()
之后,您可以根据需要更新实例。有两种访问实例的方法:
1)使用.save
方法返回的对象(如上所示)
2)您可以使用serializer.instance。 (同样,您只能在调用instance
之后访问.save
。)