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



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

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

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

编辑:字段用户和 a 有点像其他字段的复合主键,所以我将它们read_only序列化程序。API 从不处理model_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中覆盖update函数。更新模型混合生命。检查更新功能链接

def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data={**request.data, user: self.request.user}, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
return Response(serializer.data)

最终通过覆盖序列化程序中的创建/更新方法来解决这个问题

def create(self, validated_data):
instance = M.objects.create(user=self.context['request'].user,
**validated_data)
return instance

最新更新