【问题标题】:How can I get user from serializer?如何从序列化程序中获取用户?
【发布时间】:2021-03-14 16:58:15
【问题描述】:

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

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)

【问题讨论】:

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


    【解决方案1】:

    用户可从请求中获得,而不是序列化程序。你已经在 destroy() 中使用了 self.request.user 并且你可以在 perform_update() 中做同样的事情

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

    【讨论】:

    猜你喜欢
    • 2016-10-03
    • 2022-11-22
    • 2021-11-21
    • 2019-08-06
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2020-11-15
    相关资源
    最近更新 更多