简体   繁体   中英

How can I get user from serializer?

I am trying to override perform_update in my views , get user from serializer and assign it to updated_by in my Category model.

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()

serializer

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

views:

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)

User is available from request, not serializer. You are already using self.request.user in destroy() and you can do the same thing in perform_update()

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM