2015-01-23 3 views
4

Попытка доступа к моей странице json Я получаю эту ошибку!AttributeError с Django REST Framework и отношения ManyToMany

AttributeError at /project/api/1.json 
Got AttributeError when attempting to get a value for field `title` on serializer `TaskSerializer`. 
The serializer field might be named incorrectly and not match any attribute or key on the `RelatedManager` instance. 
Original exception text was: 'RelatedManager' object has no attribute 'title'. 

У меня есть отношения многие ко многим с моими моделями:

class Project(models.Model): 
    owner = models.ForeignKey('auth.User') 
    title = models.CharField(max_length=100) 
    slug = models.SlugField(unique=True) 
    created_date = models.DateTimeField(auto_now_add=True, auto_now=False) 
    updated_date = models.DateTimeField(auto_now_add=False, auto_now=True) 

    def __str__(self): 
     return self.title 

    def save(self, **kwargs): 
     super(Project, self, **kwargs).save() 
     self.slug = slugify(self.title) 
     super(Project, self, **kwargs).save() 

    def create(self): 
     pass 


class Task(models.Model): 
    title = models.CharField(max_length=100) 
    description = models.TextField(blank=True) 
    completed = models.BooleanField(default=False) 
    project = models.ForeignKey('Project', related_name="tasks") 
    dependency = models.ManyToManyField('self', through='Dependency', null=True, 
     blank=True, through_fields=('task', 'sub_task'), symmetrical=False) 

    def sub_tasks(self, **kwargs): 
     qs = self.dependency.filter(**kwargs) 
     for sub_task in qs: 
      qs = qs | sub_task.sub_tasks(**kwargs) 
     return qs 

    def __str__(self): 
     return self.title 

class Dependency(models.Model): 
    task = models.ForeignKey(Task, related_name="dependency_task") 
    sub_task = models.ForeignKey(Task, related_name="dependency_sub_task") 

И эти сериализаторов:

class TaskSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Task 
     fields = ('id', 'title', 'project', 'completed',) 


class ProjectSerializer(serializers.ModelSerializer): 
    tasks = TaskSerializer() 
    class Meta: 
     model = Project 
     fields = ('id', 'title', 'tasks',) 

Как я могу обойти это? RelatedManager сообщает мне, что что-то не согласуется с моей ссылкой M2M, но почему/как? Я ничего не видел here об ошибках атрибута.

Этот вопрос кажется связанным, но установка many=False ничего не делает.

AttributeError with Django REST Framework and MongoEngine

ответ

13

В этом вопросе они устанавливают many=False. У вас do есть много-ко-многим, поэтому установлено many=True Это просто.

В самом деле, если присмотреться, то это, как пример показывает вам это сделать:

class TrackListingField(serializers.RelatedField): 
    def to_representation(self, value): 
     duration = time.strftime('%M:%S', time.gmtime(value.duration)) 
     return 'Track %d: %s (%s)' % (value.order, value.name, duration) 

class AlbumSerializer(serializers.ModelSerializer): 
    tracks = TrackListingField(many=True) 

    class Meta: 
     model = Album 
     fields = ('album_name', 'artist', 'tracks') 

Посмотрите, как дорожки списка полей имеет атрибут many=True? Сделай это.

3

У меня была аналогичная проблема, когда я пропустил указание атрибута related_name на определение ForeignKeyField, указывающее на модель Album.

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