2016-03-05 212 views
1

我有Django的REST框架的一个问题,我在学习权限和关联设置为我的API,因此,林无法运行服务器,因此它说Asse田:现场(READ_ONLY =真)应ReadOnlyFieldDjango的REST框架:Asse田

我model.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 

林不知道我搞砸了。任何帮助非常感谢

回答

0

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

尝试

class TaskSerializer(serializers.ModelSerializer): 

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

的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 
+0

我得到** TypeError:__init __()得到关键字参数'read_only'的多个值** – Coeus