2016-06-07 19 views
0

我想了解使用relatedname_set.allrelatedname.all之間的區別。我有一個模板,我無法通過一個ForeignKey與relatedname_set.all迭代對象。我只是碰巧把它改成relatedname.all,它工作。見下文。我有一個ListView,它提供了指向模板的所有Cooker對象。在模板中使用object.relatedname_set.all和object.relatedname.all作爲ForeignKey

我的模型

class Cooker(models.Model): 
    name = models.CharField(max_length=20, name="name") 
    background = models.CharField(max_length=500, name="background") 

class Formula(models.Model): 
    food = models.CharField(max_length=200, name="food") 
    maker = models.ForeignKey(Cooker, related_name="cooker2") 

模板的作品:

<body> 
{% for cook in cooker_list %} 
    <h2><li>{{ cook.name }}</li></h2> 
    <li>{% for recipe in cook.cooker2.all %} 
     {{ recipe.food }} 
     {% endfor %}</li> 
{% endfor %} 
</body> 

不工作(4號線)模板行:

<li>{% for recipe in cook.cooker2_set.all %} 
+1

因爲您已經在關係上設置了related_name,所以您必須正確使用 –

+0

cooker2_set'除非擁有'related_name ='cooker2_set'',否則不會工作。如果你不設置'related_name',它將默認爲'formula_set'。看看你的模型,我會推薦'related_name ='公式',因爲'cook.formulas.all()'給你相關的'Formula'實例,而不是'Cooker'實例。 – Alasdair

+0

好的,謝謝,我會瀏覽我的ForeignKeys並選擇一些更好的名字。我最初遠離使用Model name作爲'related_name',因爲當我第一次啓動時,我不確定是否實際使用'related_name'或使用Model名稱。由於它們都是相同的,但現在我得到它。 – ratrace123

回答

0

從文檔爲be careful with related_name

如果在抽象基類指定一個字段的related_name屬性,則默認反向名稱將是子類,然後的名字,只是因爲它通常是,如果你」 d直接在子類上聲明該字段。例如,在上面的代碼中,如果省略related_name屬性,則m2m字段的反向名稱將在ChildA情況下爲childa_set,在ChildB字段中爲childb_set。

本質上,通過提供自己的,你重寫默認值。

+1

謝謝,這正是我所尋找的。 – ratrace123