在模板中使用 object.relatedname_set.all vs object.relatedname.all



我试图了解使用 relatedname_set.allrelatedname.all之间的区别。我有一个模板,我无法通过带有relatedname_set.all的外键循环访问对象。我只是碰巧将其更改为relatedname.all并且它起作用了。见下文。我有一个列表视图,它提供了指向模板的所有 Cooker 对象。

我的模型

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 %}

从文档中小心related_name

如果未为抽象基类中的字段指定 related_name 属性,则默认反向名称将是子类的名称,后跟 '_set' ,就像直接在子类上声明字段时通常一样。例如,在上面的代码中,如果省略了 related_name 属性,则 m2m 字段的反向名称将在 ChildA 案例中childa_set,childb_set ChildB 字段。

从本质上讲,通过提供自己的,您可以覆盖默认值。

最新更新