【问题标题】:How to update modified_by field with CurrentUserDefualt如何使用 CurrentUserDefualt 更新 modified_by 字段
【发布时间】:2018-04-15 12:55:29
【问题描述】:

当我尝试更新 modified_by 字段时出现此错误

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

这是我的 serializer.py:

class CustomersTagSerializer(serializers.ModelSerializer):
    created_by = serializers.CharField(read_only=True, default=serializers.CurrentUserDefault())
    modified_by = serializers.CharField(read_only=True, default=serializers.CurrentUserDefault())

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.modified_by = validated_data.get('modified_by', instance.modified_by)
        instance.save()
        return instance

    class Meta:
        model = models.CustomersTag
        fields = (
            'id',
            'name',
            'created_date',
            'modified_date',
            'created_by',
            'modified_by',
        )

这是我的 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)

我尝试了很多来解决这个问题,但我不能......任何人都可以帮助我解决这个问题

【问题讨论】:

    标签: django django-rest-framework django-views django-serializer


    【解决方案1】:

    如果您使用 Django REST Framework 通用视图并且没有覆盖 get_serializerget_serializer_context 等方法的行为,您的序列化程序将收到一个上下文对象。这个上下文对象是一个包含请求和视图对象的字典。

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

    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-auditlog 这样的包。

    【讨论】:

      【解决方案2】:

      您可以在模型中调用 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-29
        • 2017-09-18
        • 2021-02-11
        • 2017-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-17
        相关资源
        最近更新 更多