django 使用ModelViewSet更改对象

xzv2uavs  于 2022-12-01  发布在  Go
关注(0)|答案(1)|浏览(216)

我正在用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,有没有更好的方法可以改变属性并返回对象BTW我试图返回一个未经授权的响应时,它不是那个用户,但我不能返回一个响应,如果有人可以请帮助我,甚至可以建议一个更好的方法来做,这将帮助我很多,谢谢
我正在尝试呈现一个对象,当它由正确的用户呈现时,更改该对象的属性

pgvzfuti

pgvzfuti1#

首先,您需要调用save方法,将obj.save更改为obj.save(),并且不要忘记在kwargs的路径中添加参数。我强烈建议创建一个继承自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

相关问题