【问题标题】:How to edit user permission in Django Rest Framework如何在 Django Rest Framework 中编辑用户权限
【发布时间】:2019-03-24 05:39:37
【问题描述】:

我正在关注django Rest Framework的教程。我想添加基于用户的权限,以便只有经过身份验证的用户才能查看每个用户的详细信息。 Objective : 任何人都可以查看UserList,但只有拥有者才能查看UserDetail。

models.py

class Meeting(models.Model):
        created = models.DateTimeField(auto_now_add=True)
        sinceWhen = models.DateTimeField(null=True)
        tilWhen = models.DateTimeField(null=True)
        owner = models.ForeignKey('auth.User', related_name='meetings', on_delete=models.CASCADE)
        #highlighted = models.TextField()

        def save(self, *args, **kwargs):
                super(Meeting, self).save(*args, **kwargs)


        class Meta:
                ordering = ('created',)

views.py

from django.contrib.auth.models import User
# User is not created inside models.py

class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserListSerializer

class UserDetail(generics.RetrieveAPIView):
        queryset = User.objects.all()
        serializer_class = UserSerializer
        permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly,)
# I added IsOwnerOrReadOnly to make it work, but this is the part where it causes error!

serializers.py

class UserSerializer(serializers.ModelSerializer):
        meetings = serializers.PrimaryKeyRelatedField(many=True, queryset=Meeting.objects.all())
        #owner = serializers.ReadOnlyField(source='owner.username')

        class Meta:
                model = User
                fields = ('id', 'username', 'meetings',)

class UserListSerializer(serializers.ModelSerializer):
        #meetings = serializers.PrimaryKeyRelatedField(many=True, queryset=Meeting.objects.all())

        class Meta:
                model = User
                fields = ('username',)

permissions.py

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):  
        def has_object_permission(self, request, view, obj):

                # Any permissions are only allowed to the owner of the meeting
                return obj.owner == request.user

我覆盖了 IsOwnerOrReadOnly 以便只有用户可以查看他/她的用户详细信息的详细信息。 并将其添加到views.py 中的permission_class。

然后我得到了这个错误:

File "/home/tony/env/lib/python3.6/site-packages/rest_framework/views.py" in check_object_permissions
  345.             if not permission.has_object_permission(request, self, obj):

File "/home/tony/swpp_hw1/meetings/permissions.py" in has_object_permission
  15.       return obj.owner == request.user

Exception Type: AttributeError at /users/1/
Exception Value: 'User' object has no attribute 'owner'

我尝试在 models.py 中添加用户类,但又导致错误... 如何解决这个问题?

【问题讨论】:

  • User 模型上没有 owner。有一个名为 meetings 的反向关系与 Meeting 模型。 > 任何人都可以查看 UserList,但只有所有者才能查看其 UserDetail。您的权限类只需要测试 obj == request.user。这意味着正在查找的用户等于正在执行查找的用户。由于数据模型,会议所有权将被固有地处理,即用户详细信息视图将仅显示查找用户拥有的会议。

标签: django django-rest-framework django-permissions


【解决方案1】:

尝试将其更改为:

return obj == request.user 

object 是您尝试访问的用户,request.user 是当前经过身份验证的用户。

【讨论】:

  • 谢谢。仅与 UserSerializer 类一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-17
  • 2018-05-20
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多