2016-03-05 5 views
1

У меня есть проблема с Джанго Rest Framework, я узнавал, чтобы установить разрешения и объединение к моему API, и, таким образом, Im не удается запустить сервер так говорит AssertionError: поле (read_only = True) должны быть ReadOnlyFieldДжанго Rest Framework: AssertionError

Мой 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

Im get ** TypeError: __init __() получил несколько значений для аргумента ключевого слова 'read_only' ** – Coeus

Смежные вопросы