首页 > 解决方案 > 如何从序列化程序中获取用户?

问题描述

我试图perform_update在我的views, 从序列化程序中获取用户并将其分配给updated_by我的Category模型中。

class Category(models.Model):
    name       = models.CharField(max_length=80)
    created_at = models.DateTimeField(auto_now_add = True, null = True)
    created_by = CurrentUserField()
    updated_at = models.DateTimeField(auto_now = True, null = True)
    updated_by = models.ForeignKey(User, default = None, blank=True, null=True, on_delete=models.DO_NOTHING, related_name="updated_by")
    deleted_at = models.DateTimeField(null = True)
    deleted_by = models.ForeignKey(User, default = None, blank=True, null=True, on_delete=models.DO_NOTHING, related_name='deleted_by')
    
    
    class Meta:
        verbose_name_plural = "Categories"

    def __str__(self):
        return self.name
    
    def soft_delete(self, deleter):
        self.deleted_by = deleter
        self.deleted_at = timezone.now()
        self.save()

串行器

class CategorySerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Category
        fields = "__all__"

意见:

class CategoryView(viewsets.ModelViewSet):
    serializer_class = CategorySerializer
    queryset = Category.objects.all()

    def get_permissions(self):
        if self.request.method == "GET":
            self.permission_classes = (AllowAny, )
        else:
            self.permission_classes = (IsAdminUser, )

        return super(CategoryView, self).get_permissions()

    def perform_update(self, serializer):
        instance = self.get_object()
        instance.updated_by = username
        serializer.save()
    

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        deleter = self.request.user
        self.perform_destroy(instance, deleter)
        return Response(status=status.HTTP_204_NO_CONTENT)

    def perform_destroy(self, instance, deleter):
        instance.soft_delete(deleter)

标签: pythondjangodjango-rest-frameworkdjango-viewsdjango-serializer

解决方案


用户可根据请求获得,而不是序列化程序。您已经在使用self.request.userindestroy()并且可以在 in 中做同样的事情perform_update()

def perform_update(self, serializer):
    serializer.save(updated_by=self.request.user)

推荐阅读