【问题标题】:Object has no attribute 'entry_set' error对象没有属性“entry_set”错误
【发布时间】:2019-02-15 18:11:00
【问题描述】:

我是 Python 新手,正在尝试完成 Python 速成课程,但遇到了一个我无法弄清楚的问题。这是我的错误:

“Pizza”对象没有属性“entry_set”

在我的模型中,我在 Toppings 中为 Pizza 定义了外键,它工作正常,但我显然不理解 entry_set 的定义。

这是我的网址代码:

from django.urls import path
from . import views

app_name = 'pizzas'

urlpatterns = [
    # home path
    path('', views.index, name='index'),
    # show all pizza names
    path('names/', views.names, name='names'),
    # show all pizza toppings
    path('toppings/', views.toppings, name='toppings'),
    # show a pizza and it's toppings
    path('names/<int:name_id>/', views.pizza, name='pizza'),
]

这是我的视图代码(如您所见,我有entry_set):

def pizza(request, name_id):
    """Show a single pizza and all it's toppings"""
    name = Pizza.objects.get(id=name_id)
    toppings = name.entry_set.order_by('topping')
    context = {'name': name, 'toppings': toppings}
    return render(request, 'pizzas/pizza.html', context)

最后,我的 HTML 代码:

{% extends 'pizzas/base.html' %}
{% block content %}

  <p>{{ name }}</p>

  <p>Toppings:</p>

    <ul>
      {% for topping in toppings %}
        <li>
            <p>{{ topping|linebreaks }}</p>
        </li>
    </ul>

{% endblock content %}

这是models.py:

from django.db import models


class Pizza(models.Model):
    """Pizza names """
    name = models.CharField(max_length=50)

    def __str__(self):
        """Return a string representation of the model"""
        return self.name


class Toppings(models.Model):
    """Pizza toppings """
    pizza = models.ForeignKey(Pizza, on_delete=models.DO_NOTHING)
    topping = models.CharField(max_length=50)

    def __str__(self):
        """Return a string representation of the model"""
        return self.topping

提前谢谢你!

【问题讨论】:

标签: python django jinja2


【解决方案1】:

Pizza 和 Topping 模型具有多对一关系。这就是“外键”关系。您的数据库中有两个不同的表(以及许多其他表)。一份用于披萨,一份用于浇头。 ForeignKey 关系的作用是在 Topping 表中放置一列,该列指向 Pizza 表中的一行。这是一种将这些表中的条目相互关联的方法。

如果你有 Topping 实例:

pepperoni.pizza

将返回披萨。

您要问的是如何走另一条路。有一个比萨饼实例,然后得到浇头。使用指向 Pizza 实例的 Pizza 列获取 Toppings 表中的所有行。

在 Django 中有一个叫做 related_name 的东西,你可以这样定义它:

class Toppings(models.Model):
    """Pizza toppings """
    pizza = models.ForeignKey(Pizza, on_delete=models.DO_NOTHING, related_name='toppings')

你可以这样做:

afternoon_pizza.toppings.all()

退回下午比萨的所有配料。默认的related_name 是'name_of_your_model' + '_set'。因此,如果没有上述修改,您可以获得相同的结果:

afternoon_pizza.toppings_set.all()

我最好的猜测是你书中的例子有一个叫做“条目”的字段。

django 文档比我解释的要好得多:https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_one/

希望对您有所帮助。

【讨论】:

  • 谢谢你,艺术。这是一个很好的解释。你是对的,书中的例子确实有一个名为“entry”的字段。猜猜这就是我在 Google 中找不到“entry_set”的原因!大声笑
【解决方案2】:

问题是你在这行使用entry_set

toppings = name.entry_set.order_by('topping')

你必须使用 foo_set 其中foo 是小写的类名(例如toppings?)

toppings = name.toppings_set.order_by('topping')

【讨论】:

    【解决方案3】:

    不知道为什么你会认为它应该有一个entry_set。唯一与 Pizza 相关的模型是 Topping,并且您没有在 ForeignKey 上设置自定义 related_name,因此 Pizza 有一个 topping_set

    【讨论】:

    • 我刚刚搜索了“related_name”,发现如果没有定义,Python会取模型的名称并创建一个。那么,这是否意味着我应该使用 Pizza_set?我试过了,它也没有用,“Pizza”对象没有属性“pizza_set”。也许我会尝试添加一个related_name,即使我不需要。
    • 不,我告诉过你它是什么:topping_set。 related_name 指的是反向关系。比萨有一组配料,而不是一组比萨或条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2014-05-14
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多