Изменить объект с помощью 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