使用CreateModelMixin.create()

时间:2018-10-08 05:53:56

标签: python django django-rest-framework

我使用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)

1 个答案:

答案 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。)