AttributeError: Django Модель не имеет атрибута 'instructor_name' - PullRequest
0 голосов
/ 29 апреля 2020

Попытка выяснить, почему я получаю ошибку атрибута здесь. Я проделал этот же процесс раньше в учебнике Django, но здесь я получаю ошибку атрибута, используя тот же лог c.

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. Когда я создаю и сохраняю данные в базе данных, я возвращаюсь и присваиваю данные объекту с помощью 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/

1 Ответ

1 голос
/ 29 апреля 2020

Краткий ответ: Попробуйте с

d.instructor_set.all()

Длинный ответ:

Способ django создает обратную связь между двумя моделями, к которым присоединяется ForeignKey, путем создания нового атрибута в модель, которая не имеет ForeignKey (в данном случае отдел). Имя атрибута: model name in lowercase _set

Итак, если у вас есть объект Department d , способ получить всех инспекторов, принадлежащих отделу, -

d.instructor_set.all()

Примечание: я бы сказал, что проблемы вызваны именами ваших атрибутов. Вместо " департамент_имя " и " инструктор_имя " я бы просто использовал " имя ", чтобы при печати названия отдела просто сказать "отдел" .name ", который очень читабелен.

Также d.inspector_name.all () изменится на d.name.all (), что легко определяется как ошибка.

...