![](/img/trans.png)
[英]How to count all ForeignKey models with exact field values in Django?
[英]Django: How to return all models associated with a ForeignKey including all attributes of those models?
我有一個應用程序,我想在訪問該頁面時僅顯示與該頁面相關聯的所有URL鏈接。
它與reddit相似,因為它有許多用戶頁面(又名subreddit),並且每個頁面都有與之關聯的無限可能的已提交鏈接。 newlinkposts
記錄通過ForeignKey
與某個頁面相關聯。
給定一個頁面,哇,我可以返回所有相關的newlinkpost
對象(包括其相應的點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
當您在模型中添加ForeignKey
以及在源模型中創建屬性(在您的情況下為newlinkpost
)以允許您找到一個關聯的對象時,Django還將在目標模型內創建一個相應的屬性(在您的情況下顯然是userpagename
)。
默認情況下,此屬性以源表命名,因此,在您的情況下,它將為newlinkpost_set
。
這使您可以提出您要回答的問題:哪些newlinkpost
對象具有此userpagename
newlinkpost
all_links = userpagename_instance.newlinkpost_set.all()
如果您希望應用其他過濾器,則可以改用filter
方法:
some_links = userpagename_instance.newlinkpost_set.filter(...)
newlinkpost_set
屬性包含一個RelatedManager對象,它是Manager的子類型,允許您使用與在newlinkpost.objects
上可以使用的相同的方法集,以及一些允許您創建新的相關對象的方法。
這是使用此技術的示例視圖:(假設您已將模型類導入到views模塊中):
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>
您只需要使用反向關系。
my_userpagename.newlinkpost_set.all()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.