Объект 'RelatedManager' не имеет атрибута
У меня есть модель, определенная следующим образом:
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)
Почему он не работает?
Я получаю эту ошибку:
'СвязанныйManager' объект не имеет атрибута 'избранное'
Я думаю, details
не правильный тип, но почему бы и нет? И как я могу выполнить такой запрос?
Ответы
Ответ 1
При доступе к user.details
он обращается к обратной ссылке внешнего ключа UserDetail.user
. Сам внешний ключ не указывает, что User
может иметь только один UserDetail
, поэтому django предоставляет вам RelatedManager
, который вы можете фильтровать и запрашивать, как обычный Manager
. Таким образом, вы делаете то же самое для своих менеджеров .objects
. Вы можете запросить user.details.all()
, user.details.filter()
, user.details.get()
и т.д., Которые либо выдадут вам запрос, объект или исключение, в зависимости от метода и результатов.
Ответ 2
Попробуйте
request.user.details.get().favourites.add(article)
Это предполагает, что объект UserDetail уже существует для этого пользователя, иначе get()
вызовет исключение.