簡體   English   中英

Django Rest框架:AssertionError

[英]Django Rest Framework: AssertionError

我的Django Rest Framework有問題,我正在學習設置權限和與我的API的關聯 ,因此我無法運行服務器,因此它說AssertionError:Field(read_only = True)應該為ReadOnlyField

我的模型

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

我不確定我搞砸了。 任何幫助深表感謝

owner.username可能有問題,因為我看不到如何直接更新它。

嘗試

class TaskSerializer(serializers.ModelSerializer):

    class Meta:
        model = Task
        read_only=('owner.username',)
        fields=('title','description','completed','owner.username')

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')

另外,您還需要驗證對象是否具有owner屬性:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM