我是Python的新手,试图通过Python速成课程学习,但遇到了一个我无法解决的问题。这是我的错误:
“比萨”对象没有属性“ 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
提前谢谢!
答案 0 :(得分:0)
不确定您为什么会认为它应该有entry_set
。与Pizza相关的唯一模型是Topping,并且您没有在ForeignKey上设置自定义related_name
,因此Pizza具有topping_set
。
答案 1 :(得分:0)
Pizza and Topping模型具有多对一关系。这就是“ ForeignKey”关系。数据库中有两个不同的表(还有许多其他表)。一份披萨和一份浇头。 ForeignKey关系的作用是在Topping表中放置一列,该列指向Pizza表中的一行。这是将这些表中的条目相互关联的一种方法。
如果您有Topping实例:
pepperoni.pizza
将返回比萨。
您要问的是如何走另一条路。拥有一个披萨实例,然后获得浇头。要获得“浇头”表中的所有行,并带有指向“比萨饼”实例的“比萨饼”列。
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()
将所有浇头都归还给Lunch_Pizza。默认的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/
希望有帮助。
答案 2 :(得分:0)
问题是您在这一行中使用了 entry_set
:
toppings = name.entry_set.order_by('topping')
并且你必须使用
foo_set
其中 foo
是小写的类名(例如,toppings
?)
toppings = name.toppings_set.order_by('topping')