Изменить объект с помощью ModelViewSet

Я строю проект с DRF и пытаюсь понять, как работает modelviewset, я посылаю url вот так: localhost/do_somthing/object_id/ и маршрутизирую его с помощью :

router.register('do_somthing', views.do_somthing, basename='do_somthing')

мнение таково:

class do_somthing_View(viewsets.ModelViewSet):
    serializer_class = ObjectSerializer
    permission_classes = [permissions.IsAuthenticated]
    queryset = Object.objects.all()
    http_method_names = ['get']

    def get_queryset(self):
        obj= Object.objects.get(id=self.kwargs['pk'])
        user = self.request.user
        if user == obj.user:
            obj.att= True
            obj.save
            return self.queryset
        else:
            None

объектная модель выглядит следующим образом:

class Object(models.Model):
    user= models.ForeignKey(User, on_delete=models.PROTECT, related_name="realted_user")
    name= models.CharField(max_length=50)
    att= models.BooleanField(default=False)

    def __str__(self):
        return self.name

проблема в том, что атрибут никогда не изменяется и по-прежнему установлен в False есть ли способ изменить атрибут и вернуть объект? BTW я пытался вернуть неавторизованный ответ, когда это не тот пользователь, но я не могу вернуть ответ. Если кто-то может помочь мне или может даже предложить лучший способ сделать это. это бы мне очень помогло спасибо

я пытаюсь представить объект и, когда он представлен правильным пользователем, изменить атрибут этого объекта

прежде всего необходимо вызвать метод save и изменить obj.save на obj.save() и не забудьте добавить params в путь для kwargs. Я советую переопределять get или update для этого, а не get_queryset Для возврата unauthorized я настоятельно рекомендую создать пользовательский класс разрешения, наследующий от IsAuthenticated и переопределяющий has_object_permission. он сделает все за вас он убедится, что это пользовательское разрешение вернет 403, если это не так (это происходит в обработчике исключений по умолчанию drf) если вы не хотите этого делать и все еще хотите получить ответ 403, сделайте следующее:

from rest_framework.exceptions import PermissionDenied

class do_somthing_View(viewsets.ModelViewSet):
    ...

    def get_queryset(self):
        ...
        if user == obj.user:
           ...
        else:
            raise PermissionDenied("some proper message")

Я все еще НАСТОЯТЕЛЬНО советую вам использовать пользовательский класс разрешения и перенести логическую часть из get_queryset

Вернуться на верх