Django 如何使用CurrentUserDefualt按字段更新修改的_

Django 如何使用CurrentUserDefualt按字段更新修改的_,django,django-rest-framework,django-views,django-serializer,Django,Django Rest Framework,Django Views,Django Serializer,当我试图按字段更新修改的_时,出现此错误 Tried to update field sales.CustomersTag.modified_by with a model instance, <SimpleLazyObject: <UserProfile: Admin>>. Use a value compatible with CharField. 这是my view.py: class CustomerTagGetIdPutView(generics.Retrie

当我试图按字段更新修改的_时,出现此错误

Tried to update field sales.CustomersTag.modified_by with a model instance, <SimpleLazyObject: <UserProfile: Admin>>. Use a value compatible with CharField.
这是my view.py:

class CustomerTagGetIdPutView(generics.RetrieveAPIView,
                              mixins.UpdateModelMixin):
    permission_classes = (AllowAny,)
    queryset = models.CustomersTag.objects.all()
    serializer_class = CustomersTagSerializer

    def get_object(self):
        id = self.kwargs['id']
        obj = generics.get_object_or_404(models.CustomersTag, id=id)
        return obj

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def patch(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

我曾试图解决这个问题,但我做不到。。任何人都可以帮助我解决此问题

您可以在模型中调用
save()
时执行此操作。 例如:

class CustomersTagSerializer(serializers.ModelSerializer):
     created_by = models.ForeignKey(User, null=True, editable=False)
     modified_by = models.ForeignKey(User, null=True, editable=False)

def save(self, *args, **kwargs):
    user = get_current_user()
    if user and user.is_authenticated():
        self.modified_by = user
        if not self.id:
            self.created_by = user
    super(CustomersTagSerializer, self).save(*args, **kwargs)
class CustomersTagSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.CustomersTag
        fields = (
            'id',
            'name',
            'created_date',
            'modified_date',
            'created_by',
            'modified_by',
        )

    def create(self, validated_data):
        user = self.context['request'].user
        return models.CustomersTag.objects.create(
            created_by=user, **validated_data)

    def update(self, instance, validated_data):
        user = self.context['request'].user
        instance.name = validated_data.get('name', instance.name)
        instance.modified_by = user
        instance.save()
        return instance

如果您使用的是Django REST框架泛型视图,并且没有重写方法的行为,如
get\u serializer
get\u serializer\u context
,那么序列化程序将接收一个context对象。此上下文对象是包含请求和视图对象的字典

也就是说,您可以通过覆盖序列化程序中的
create()
update()
来实现这一点。例如:

class CustomersTagSerializer(serializers.ModelSerializer):
     created_by = models.ForeignKey(User, null=True, editable=False)
     modified_by = models.ForeignKey(User, null=True, editable=False)

def save(self, *args, **kwargs):
    user = get_current_user()
    if user and user.is_authenticated():
        self.modified_by = user
        if not self.id:
            self.created_by = user
    super(CustomersTagSerializer, self).save(*args, **kwargs)
class CustomersTagSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.CustomersTag
        fields = (
            'id',
            'name',
            'created_date',
            'modified_date',
            'created_by',
            'modified_by',
        )

    def create(self, validated_data):
        user = self.context['request'].user
        return models.CustomersTag.objects.create(
            created_by=user, **validated_data)

    def update(self, instance, validated_data):
        user = self.context['request'].user
        instance.name = validated_data.get('name', instance.name)
        instance.modified_by = user
        instance.save()
        return instance
但是,如果您想在模型中维护版本的日志历史记录,您可以使用类似的包