Django models 如何将self.request.user作为更新字段传递?

Django 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

我有一个模型,其中经过身份验证的用户是一个FK字段。通过UpdateModelMixin调用self.partial_update时遇到问题,因为用户字段不能为null

我相信,当它无法更新并返回到创建时,就会发生这种情况。如何仅在创建时将user=self.request.user作为参数传递

我试图修改request.data dict,但它显然是不可变的

编辑:user和a字段有点像其他字段的复合主键,所以我让它们在序列化程序中只读。API从不处理模型id pk

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