web-dev-qa-db-ja.com

「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)

なぜ機能しないのですか?

私はこのエラーを受け取ります:

「RelatedManager」オブジェクトには属性「お気に入り」がありません

detailsは適切なタイプではないと思いますが、なぜそうではないのですか?そして、どうすればそのようなクエリを実行できますか?

27
mpen

_user.details_にアクセスすると、_UserDetail.user_外部キーの後方参照にアクセスします。外部キー自体は、UserUserDetailを1つだけ持つことができると指定していないため、DjangoはRelatedManagerを提供します。通常のManagerと同じようにフィルタリングとクエリを実行できます。つまり、_.objects_マネージャーに対して行うのと同じことを実行します。user.details.all()user.details.filter()user.details.get()など。メソッドと結果に応じて、クエリセット、オブジェクト、または例外のいずれかを提供します。

42
jcdyer

試す

_request.user.details.get().favourites.add(article)
_

これは、そのユーザーのUserDetailオブジェクトがすでに存在していることを前提としています。そうでない場合、get()は例外を発生させます。

10
Alasdair