Подтвердить что ты не робот

Объект '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 не правильный тип, но почему бы и нет? И как я могу выполнить такой запрос?

4b9b3361

Ответ 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() вызовет исключение.