gpt4 book ai didi

django - 这个QueryDict实例是不可变的

转载 作者:行者123 更新时间:2023-12-04 03:16:47 28 4
gpt4 key购买 nike

我有一个带有外键帐户的分支模型(分支的所有者):

class Branch(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE_CASCADE
name = models.CharField(max_length=100)
account = models.ForeignKey(Account, null=True, on_delete=models.CASCADE)
location = models.TextField()
phone = models.CharField(max_length=20, blank=True,
null=True, default=None)
create_at = models.DateTimeField(auto_now_add=True, null=True)
update_at = models.DateTimeField(auto_now=True, null=True)

def __str__(self):
return self.name

class Meta:
unique_together = (('name','account'),)

...


我有一个带有用户外键的帐户模型(一对一字段):

class Account(models.Model):
_safedelete_policy = SOFT_DELETE_CASCADE
name = models.CharField(max_length=100)
user = models.OneToOneField(User)
create_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)

def __str__(self):
return self.name + ' - ' + self.create_at.strftime('%Y-%m-%d %H:%M:%S')


我为分支创建了ModelViewSet,它显示了登录用户拥有的分支:

class BranchViewSet(viewsets.ModelViewSet):
serializer_class = BranchSerializer
permission_classes = (permissions.IsAuthenticated,)


def get_queryset(self):
queryset = Branch.objects.all().filter(account=self.request.user.account)
return queryset


现在要创建一个新分支,我想使用request.user.account保存帐户字段,而不是使用其余客户端发送的数据保存(为了提高安全性)。例如:

def create(self, request, *args, **kwargs):
if request.user.user_type == User.ADMIN:
request.data['account'] = request.user.account
return super(BranchViewSet, self).create(request, *args, **kwargs)

def perform_create(self, serializer):
'''
Associate branch with account
'''
serializer.save(account=self.request.user.account)


在分支序列化器中

class BranchSerializer(serializers.ModelSerializer):
account = serializers.CharField(source='account.id', read_only=True)

class Meta:
model = Branch
fields = ('id', 'name', 'branch_alias',
'location', 'phone', 'account')
validators = [
UniqueTogetherValidator(
queryset=Branch.objects.all(),
fields=('name', 'account')
)
]


但是我得到了这个错误:
此QueryDict实例是不可变的。 (意味着request.data是一个不变的QueryDict,无法更改)

您是否知道使用django rest框架创建对象时添加其他字段的更好方法?

最佳答案

如您在Django documentation中看到的:


在正常的请求/响应周期中访问request.POST和request.GET时的QueryDicts将是不可变的。


因此您可以使用同一文档中的建议:


要获得可变版本,您需要使用QueryDict.copy()


或...使用一些小技巧,例如,如果出于某种原因需要保留对对象的引用或使对象保持不变:

# remember old state
_mutable = data._mutable

# set to mutable
data._mutable = True

# сhange the values you want
data['param_name'] = 'new value'

# set mutable flag back
data._mutable = _mutable


数据在哪里是您的QueryDicts

关于django - 这个QueryDict实例是不可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44717442/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com