2014-09-06 65 views
1

我有一個應用程序,我想簡單地顯示頁面訪問時頁面與其關聯的所有URL鏈接。Django:如何返回與ForeignKey相關的所有模型,包括這些模型的所有屬性?

它與reddit類似,有很多用戶頁面(又名子目錄),每個頁面都有無限可能數量的提交鏈接與它相關聯。 newlinkposts記錄通過ForeignKey與某個頁面關聯。

鑑於一個頁面,我可以得到所有相關的newlinkpost對象(包括它們相應的喜歡,鏈接評論和發佈日期)返回,以便顯示它們在模板中?

newlinkpost對象的定義如下:

class newlinkpost(models.Model): 
    newlink_tag = models.ForeignKey('userpagename') #tags link to which userpage it belongs to 
    link_comment = models.CharField(max_length=128) #comment to go along with post 
    post_date = models.DateField(auto_now=True, auto_now_add=False, null=False) #submission  datestamp. later make it track editable posts if edit function is implemented 
    url = models.URLField(max_length = 1024, null=False) #actual submitted link 
    link_likes = models.IntegerField(null=False, default=0) #need to later create like button which will +1 the value 

    def __unicode__(self): 
     return self.url 
+0

順便說...不是真的與你的問題,但是按照慣例,類(包括模型子類)通常用大寫字母命名,使他們明顯區別於實例。例如''NewLinkPost''和''UserPageName''在你的情況下。 – 2014-09-06 21:26:32

+0

謝謝,讓我知道。我會通過並將模型類更改爲大寫字母。 – EazyC 2014-09-06 23:10:35

回答

1

當您在模型中添加ForeignKey,以及創建在源模型,讓您找到一個相關物品的屬性(在你的情況,newlinkpost),Django的還創建內部的相應屬性目標模型(在你的情況下顯然userpagename)。

默認情況下,此屬性以源表命名,所以在您的情況下它將是newlinkpost_set

這讓你問你要找來回答這個問題:這newlinkpost對象有此userpagename

all_links = userpagename_instance.newlinkpost_set.all() 

如果你想申請額外的過濾器,可以使用filter方法來代替:

some_links = userpagename_instance.newlinkpost_set.filter(...) 

newlinkpost_set屬性包含一個RelatedManager對象,這是一個Manager亞型,允許您使用相同的一組可以使用方法Ò n newlinkpost.objects,以及一些允許您創建新相關對象的其他方法。


下面是使用這種技術的示例圖:(這裏假設你已經有了導入的意見模塊的模型類):

from django.shortcuts import render 

def user_page(request, user_id): 
    page = userpagename.get(pk=user_id) 
    links = page.newlinkpost_set.all() 
    return render(
     request, 
     "myapp/user_page.html", 
     { 
      page: page, 
      links: links, 
     } 
    ) 

...這是使用的一個例子「鏈接」,在模板變量:

<ul> 
{% for link in links %} 
    <li><a href="{{ link.url }}">{{ link.link_comment }} - {{ link.link_likes }} likes</li> 
{% endfor %} 
</ul> 
+0

當我在導入模型後在python shell中嘗試命令時,我得到「userpagename_instance」未定義錯誤。我是否必須導入任何其他代碼才能使「_instance」和「_set」後綴不會返回錯誤?另外,userpage_instance命令的確切含義是什麼?謝謝你的幫助。 – EazyC 2014-09-06 22:26:14

+0

「userpagename_instance」旨在表示您已經加載的「userpagename」對象,例如,使用''userpagename_instance = userpagename.get(pk = 1)''來加載ID爲'1'的頁面,或者你正在加載你的''userpagename''對象。 – 2014-09-06 23:11:12

+0

如果您更新您的問題以包含您的用戶頁面的視圖代碼的示例,那麼我可以嘗試在我的答案中編寫更完整的示例,顯示它如何與您已擁有的代碼一起使用。 – 2014-09-06 23:14:34

0

你只需要使用反向關係。

my_userpagename.newlinkpost_set.all() 
+0

我還沒有在我的項目中使用這些命令,所以我遇到了一些問題,讓他們不返回錯誤「my_userpagename未定義」/「newlinkpost_set未定義」。當我追加後綴「_set」或前綴「my_」時,我得到這些錯誤,但正常調用如newlinkpost.objects.all()返回一切正常,沒有錯誤。感謝您的輸入。 – EazyC 2014-09-06 22:45:51

相關問題