我有一个Branch模型,它的外键指向account(分行的所有者):
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'),)
...
我有一个Account模型,其中包含指向user的外键(一对一字段):
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')
我已经为Branch创建了一个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保存account字段,而不是用rest客户端发送的数据(为了更安全)。例如:
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示例是不可变的。(意味着www.example.com是不可变的QueryDict,无法更改)request.data is a immutable QueryDict and can't be changed)
在使用djangorest框架创建对象时,你知道有什么更好的方法来添加额外的字段吗?
8条答案
按热度按时间qyyhg6bp1#
正如你在Django文档中看到的:
因此,您可以使用同一文档中的建议:
要获取可变版本,您需要使用QueryDict.copy()
或者......使用一个小技巧,例如,如果出于某种原因需要保留对某个对象的引用,或者让对象保持不变:
其中数据是您的QueryDicts
qvsjd97n2#
简单操作:
5us2dqdw3#
使mutable为true以启用在querydict或请求中的编辑。
a14dhokn4#
我个人认为这样写代码会更优雅。
cig3rfwq5#
在使用djangorest框架创建对象时,你知道有什么更好的方法来添加额外的字段吗?
创建/更新对象时提供额外数据的正式方法是将它们传递给
serializer.save()
,如下所示hrirmatl6#
https://docs.djangoproject.com/en/2.0/ref/request-response/#querydict-objects
request.POST和request.GET中的QueryDicts在正常的请求/响应周期中访问时是不可变的。要获取可变版本,您需要使用QueryDict.copy()。
jbose2ul7#
可以在函数的第一行使用
request=request.copy()
。wmvff8tz8#
另一个简单的解决方案是在请求中将内容类型设置为“json/application”,在测试中也是如此。