0

试图弄清楚为什么我在这里收到属性错误。我之前在 Django 教程中已经完成了同样的过程,但是在这里,我使用相同的逻辑遇到了属性错误。

from django.db import models
from django.utils import timezone
# Create your models here.


class Department(models.Model):
    department_name = models.CharField(max_length=100)

    def __str__(self):
        return self.department_name


class Instructor(models.Model):
    belongs_to = models.ForeignKey(Department, on_delete=models.CASCADE)
    instructor_name = models.CharField(max_length=100)

    def __str__(self):
        return self.instructor_name

就像 Django 的文档教程一样,我试图在我的 python shell 中输出一个空查询集。当我创建数据并将其保存到数据库中时,我返回并将数据分配给一个对象,方法是使用d = Department.objects.get(pk=1)我可以调用的所需输出d.department_name,它会输出我最初分配的名称。当我以d.instructor_name.all()与教程相同的方式调用时,q.choice_text.all()我没有返回一个空查询集,而是这个错误:

<ipython-input-18-29fd5cce7e1e> in <module>()
----> 1 d.instructor_name.all()

AttributeError: 'Department' object has no attribute 'instructor_name'

不太确定我在这里做什么不同。我读过其他类似问题的帖子,但他们总是做一些稍微不同的事情,我似乎无法将他们学到的东西应用到我的问题上。

这是参考教程:https ://docs.djangoproject.com/en/3.0/intro/tutorial02/

4

1 回答 1

1

简短回答:尝试使用

d.instructor_set.all()

长答案:

django 在由 ForeignKey 连接的两个模型之间创建反向链接的方式是在没有 ForeignKey 的模型中创建一个新属性(在本例中为 Department)。属性名是model name in lowercase_set

因此,如果您有一个 Department 对象d,则获取属于该部门的所有检查员的方法是

d.instructor_set.all()

旁注:我认为您的属性名称导致了问题。而不是“ department_name ”和“ instructor_name ”,我会简单地使用“ name ”,这样当你想打印部门名称时,只需说“department.name”,这非常易读。

d.inspector_name.all() 也会更改为 d.name.all(),这很容易被检测为错误。

于 2020-04-28T23:53:46.977 回答