'RelatedManager'对象没有属性

mpe*_*pen 28 django

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

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)
Run Code Online (Sandbox Code Playgroud)

而我正在尝试做这样的事情:

article = get_object_or_404(Article, pk=id)
request.user.details.favourites.add(article)
Run Code Online (Sandbox Code Playgroud)

为什么不工作?

我收到这个错误:

'RelatedManager'对象没有属性'favorites'

我猜details不是正确的类型,但为什么不是呢?我该如何执行这样的查询?

jcd*_*yer 45

访问时user.details,它访问UserDetail.user外键的反向引用.外键本身没有指定一个User只能有一个UserDetail,所以django给你一个RelatedManager,你可以像常规一样过滤和查询Manager.所以你对你的.objects经理做同样的事情.你可以要求user.details.all(),user.details.filter(),user.details.get(),等等,这要么给你一个QuerySet,对象,或异常,取决于方法和结果.

  • 如果您更改了模型,以便使用OneToOneField而不是使用ForeignKey,那么您将能够完全按照预期执行操作.OneToOneFields就像ForeignKeys,因为它们只是一个相关的对象,Django会让你直接访问对象,而不是通过相关的管理器.请参阅https://docs.djangoproject.com/en/dev/ref/models/fields/#onetoonefield (9认同)
  • 哦!这现在更有意义了。我想对*我*来说很明显一个用户只有一个`UserDetail`,但我想它没有在任何地方指定。谢谢你。 (2认同)

Ala*_*air 10

尝试

request.user.details.get().favourites.add(article)
Run Code Online (Sandbox Code Playgroud)

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