【问题标题】:'RelatedManager' object has no attribute“RelatedManager”对象没有属性
【发布时间】:2009-12-01 03:49:18
【问题描述】:

我有一个这样定义的模型:

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 不是正确的类型,但为什么不是呢?我怎样才能执行这样的查询?

【问题讨论】:

    标签: django


    【解决方案1】:

    当您访问user.details 时,它会访问UserDetail.user 外键的反向引用。外键本身并没有指定User只能有一个UserDetail,所以django给你一个RelatedManager,你可以像普通的Manager一样过滤和查询。所以你对它做的事情和你对.objects 经理做的事情一样。您可以请求user.details.all()、user.details.filter()、user.details.get() 等,这将根据方法和结果为您提供查询集、对象或异常。

    【讨论】:

    • 哦!现在这更有意义了。我想 我 很明显用户只有一个UserDetail,但我想这在任何地方都没有指定。谢谢。
    • 如果您更改了模型,以便使用 OneToOneField 而不是使用 ForeignKey,您将能够完全按照您的预期进行操作。 OneToOneFields 类似于 ForeignKeys,除了因为它们只是一个相关对象,Django 将让您直接访问该对象,而不是通过相关管理器。见docs.djangoproject.com/en/dev/ref/models/fields/#onetoonefield
    【解决方案2】:

    试试

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

    这假定该用户的 UserDetail 对象已经存在,否则get() 将引发异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2017-03-04
      • 2019-04-06
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 2016-04-02
      相关资源
      最近更新 更多