【问题标题】:Django Rest Framework: AssertionErrorDjango Rest 框架:AssertionError
【发布时间】:2016-06-19 13:08:56
【问题描述】:

我的 Django Rest Framework 有问题,我正在学习为我的 API 设置 权限和关联,因此我无法运行服务器,所以它说 AssertionError: Field(read_only=True) 应该是 ReadOnlyField

我的模型.py

class Task(models.Model):
    owner=models.ForeignKey('auth.User',related_name='tasks')
    completed=models.BooleanField(default=False)
    title=models.CharField(max_length=100)
    description=models.TextField()

serializer.py

class TaskSerializer(serializers.ModelSerializer):
    owner=serializers.Field('owner.username')
    class Meta:
        model = Task
        fields=('title','description','completed','owner ')

permission.py

class IsOwnerOrReadOnly(BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method is SAFE_METHODS:
            return True

        return obj.owner==request.user

views.py

class TasksMixins(object):
    queryset = Task.objects.all()
    serializer_class=TaskSerializer
    permission_classes=(IsOwnerOrReadOnly,)

    def pre_save(self,obj):
        obj.owner=self.request.user

class TaskList(ListCreateAPIView):
    pass

class TaskDetail(RetrieveUpdateDestroyAPIView):
    pass

我不确定我搞砸了什么。非常感谢任何帮助

【问题讨论】:

    标签: python django permissions django-rest-framework


    【解决方案1】:

    IsOwnerOrReadOnly 类试图将属性所有者与登录的用户进行比较,但在您的序列化程序中您只有用户名而不是用户本身,您的序列化程序应该是这样的:

    class TaskSerializer(serializers.ModelSerializer):
        owner_username=serializers.Field('owner.username', read_only=True)
        class Meta:
        model = Task
        fields=('title','description','completed','owner', 'owner_username')
    

    您还需要验证对象是否具有所有者属性:

    class IsUserOwner(BasePermission):
        def has_object_permission(self, request, view, obj):
            if request.method is SAFE_METHODS:
                if not hasattr(obj, 'owner'):
                    return True
    
                return obj.owner == request.user
            return True
    

    【讨论】:

    • 我得到 TypeError: __init__() got multiple values for keyword argument 'read_only'
    【解决方案2】:

    问题可能与owner.username 有关,因为我不知道如何直接更新它。

    试试

    class TaskSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Task
            read_only=('owner.username',)
            fields=('title','description','completed','owner.username')
    
    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2017-11-09
    • 2018-03-01
    相关资源
    最近更新 更多