用ModelViewSet更改对象



我正在用DRF构建一个项目,我试图理解模型视图集是如何工作的,我发送这样一个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

问题是att永远不会改变,仍然设置为False有没有更好的方法来改变属性并返回对象顺便说一句,我试图返回一个未经授权的响应,当它不是那个用户,但我不能返回响应如果有人可以帮助我,或者可以建议一个更好的方法来做到这一点这对我很有帮助由于

我正在尝试呈现一个对象,当它由正确的用户呈现时,更改该对象的属性

首先需要调用save方法,将obj.save改为obj.save()不要忘记在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")

I stillstrong建议您使用自定义权限类并将逻辑部分移出get_queryset

相关内容

  • 没有找到相关文章

最新更新