在Django REST Framework中创建Organization时如何更新请求用户的organization字段?
解决Django中更新User模型实例字段的错误:'User' object has no attribute 'update'
你遇到的问题很典型——update()是Django **QuerySet(查询集)**的方法,而self.request.user是单个的User模型实例,所以直接调用update()会报错。下面给你两种正确的解决方式:
方法一:直接赋值模型字段并保存(推荐)
这种方式最直观,而且利用serializer.save()返回的已创建Organization实例,不用额外查询数据库:
class OrganizationViewSet(viewsets.ModelViewSet): queryset = Organization.objects.all() serializer_class = OrganizationSerializer permission_classes = [permissions.IsAuthenticated] def perform_create(self, serializer): # 保存并获取创建好的Organization实例 created_org = serializer.save(admin_user=self.request.user) # 给当前用户的organization字段赋值 self.request.user.organization = created_org # 保存用户实例的修改 self.request.user.save()
方法二:使用QuerySet的update方法
如果你更倾向于用QuerySet的方式更新(适合批量操作,单个实例也能用),可以通过过滤出当前用户的QuerySet来调用update():
def perform_create(self, serializer): created_org = serializer.save(admin_user=self.request.user) # 通过用户ID过滤出QuerySet,再调用update User.objects.filter(pk=self.request.user.pk).update(organization=created_org)
为什么原来的代码报错?
self.request.user是单个模型实例,Django的模型实例没有update()方法,这个方法只存在于QuerySet对象上。- 另外,你原来通过
data['id']获取组织ID再赋值的方式可以优化:serializer.save()直接返回创建好的Organization实例,用它直接赋值比取ID更安全(避免序列化器没返回id的情况),也更高效。
内容的提问来源于stack exchange,提问作者Tek Kshetri
相关产品推荐
相关产品推荐

