Django models 如何将self.request.user作为更新字段传递?
我有一个模型,其中经过身份验证的用户是一个FK字段。通过UpdateModelMixin调用self.partial_update时遇到问题,因为用户字段不能为null 我相信,当它无法更新并返回到创建时,就会发生这种情况。如何仅在创建时将user=self.request.user作为参数传递 我试图修改request.data dict,但它显然是不可变的 编辑:user和a字段有点像其他字段的复合主键,所以我让它们在序列化程序中只读。API从不处理模型id pkDjango models 如何将self.request.user作为更新字段传递?,django-models,django-rest-framework,Django Models,Django Rest Framework,我有一个模型,其中经过身份验证的用户是一个FK字段。通过UpdateModelMixin调用self.partial_update时遇到问题,因为用户字段不能为null 我相信,当它无法更新并返回到创建时,就会发生这种情况。如何仅在创建时将user=self.request.user作为参数传递 我试图修改request.data dict,但它显然是不可变的 编辑:user和a字段有点像其他字段的复合主键,所以我让它们在序列化程序中只读。API从不处理模型id pk class MView(g
class MView(generics.UpdateAPIView, mixins.UpdateModelMixin):
def get_object(self):
a_check = self.request.data.get('a') #Other validity checks but I removed it for simplicity
if a_check:
return models.M.objects.filter(user=self.request.user,a=a).first()
def put(self, request, *args, **kwargs):
try:
#request.data.update({'user':self.request.user})
print(request.data)
return self.partial_update(request, *args, **kwargs)
class M(models.Model):
user = models.ForeignKey(CustomUser,on_delete='CASCADE')
...
class MSerializer(serializers.ModelSerializer):
class Meta:
model = models.M
fields = ('a','b','c')
read_only_fields = ('user', 'a')
一种可能的解决方案是覆盖mixins.UpdateModelMixin生命周期中的
update
函数。检查更新功能
最终通过覆盖序列化程序中的create/update方法解决了这个问题
def create(self, validated_data):
instance = M.objects.create(user=self.context['request'].user,
**validated_data)
return instance
有一个输入错误,“user”:self.request.user,否则将抛出错误。未定义用户。这种替换查询dict的方法也有一个问题,似乎将它从QueryDict转换为常规dict会弄乱bool变量。i、 e.
通过了验证的_数据检查,但没有通过{'b':['true'],'c':['true'],'user':}
因为[ErrorDetail(string='必须是有效的布尔值,'code='invalid')]
我已经通过使用request.data.copy()解决了这个问题我遇到了另一个问题,因为我将user
和a
字段设置为只读,validated_data函数会删除这两个字段,从而触发非空约束错误。我在mixin中找不到负责create函数覆盖此行为的部分。从技术上讲,我可以删除只读约束,因为我正在用我以前选择的相同值更新对象,但我希望有另一种方法来解决这个问题。请注意,即使我删除只读约束,它仍然不起作用,因为我没有覆盖create方法的user字段,它仍然尝试插入具有空用户id的记录
def create(self, validated_data):
instance = M.objects.create(user=self.context['request'].user,
**validated_data)
return instance