2009-12-01 280 views
22

我有這樣定義的模型:「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' object has no attribute 'favourites'

我猜details是不正確的類型,但爲什麼不呢?我該如何執行這樣的查詢?

回答

36

當您訪問user.details時,它將訪問UserDetail.user外鍵的反向引用。外鍵本身並沒有指定User只能有一個UserDetail,所以django爲你提供了一個RelatedManager,你可以像正規的Manager一樣過濾和查詢。所以你對你做的事情和你對你的經理做的一樣。您可以要求提供user.details.all()user.details.filter(),user.details.get()等,根據方法和結果,它們會爲您提供查詢集,對象或異常。

+1

哦!現在這變得更有意義了。我猜這很明顯,*我*,用戶只有一個'UserDetail',但我想這不是在任何地方指定的。謝謝。 – mpen 2009-12-01 04:22:05

+8

如果您更改了模型,而不是使用ForeignKey,則使用了OneToOneField,您可以完全按照您的預期進行操作。 OneToOneFields與ForeignKeys類似,只不過由於它們只是一個相關對象,所以Django將直接訪問該對象,而不是通過相關管理器。 請參閱https://docs.djangoproject.com/en/dev/ref/models/fields/#onetoonefield – mbargiel 2013-01-28 17:40:28

8

嘗試

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

這是假設UserDetail對象已存在該用戶,否則get()將引發異常。