Объект «RelatedManager» не имеет атрибута - PullRequest
26 голосов
/ 01 декабря 2009

У меня есть модель, определенная так:

class UserDetail(models.Model):
    user = models.ForeignKey(User, db_index=True, unique=True, related_name='details')
    favourites = models.ManyToManyField(Article, related_name='favourited_by', blank=True)

И я пытаюсь сделать что-то вроде этого:

article = get_object_or_404(Article, pk=id)
request.user.details.favourites.add(article)

Почему это не работает?

Я получаю эту ошибку:

Объект «RelatedManager» не имеет атрибута «избранное»

Я думаю, details не тот тип, но почему бы и нет? И как я могу выполнить такой запрос?

Ответы [ 2 ]

42 голосов
/ 01 декабря 2009

Когда вы обращаетесь к user.details, он обращается к обратной ссылке внешнего ключа UserDetail.user. Сам внешний ключ не указывает, что User может иметь только один UserDetail, поэтому django дает вам RelatedManager, который вы можете фильтровать и запрашивать, как обычный Manager. Таким образом, вы делаете то же самое с ним, что вы делаете со своими .objects менеджерами. Вы можете запросить user.details.all(), user.details.filter(), user.details.get() и т. Д., Что даст вам набор запросов, объект или исключение в зависимости от метода и результатов.

10 голосов
/ 01 декабря 2009

Попробуйте

request.user.details.get().favourites.add(article)

Предполагается, что объект UserDetail уже существует для этого пользователя, в противном случае get() вызовет исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...