使用CreateModelMixin.create()向ManyToMany字段中添加对象

2024-04-25 22:35:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用mixins.CreateModelMixin.create来创建对象,但还需要将request.user添加到其中的m2m字段。所以我的想法是从self.create()捕捉对象,而不是从make obj.users.add(user)捕捉对象。但是CreateModelMixin只返回responce。如何从.create获取对象?添加用户是否更好?我可以使用super(不太好)?谢谢!你知道吗

新增:

我可以在这里使用perform_create()和catch对象,但它会使代码更大,并且大部分重复.create(),所以我认为这不是一种正确的方法。你知道吗

新增:

代码I用户现在:

@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)

Tags: 对象代码用户selfadddatarequestcreate
1条回答
网友
1楼 · 发布于 2024-04-25 22:35:38

要从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) 你可以用序列化程序.instance. (同样,您只能在调用.save之后访问instance。)你知道吗

相关问题 更多 >