Ошибка импорта для моделей в Django при импорте модели в файл валидаторов - PullRequest
1 голос
/ 05 июня 2019

Я получаю сообщение об ошибке Файл "D: \ DjangoProjects \ StudentExam \ website \ Student \ validators.py", строка 2, из .models import Branch

ImportError: невозможно импортировать имя "Branch" из'Student.models' (D: \ DjangoProjects \ StudentExam \ website \ Student \ models.py)

Для оператора «из ветви импорта .models», записанного в файле validators.py.Даже если оба этих файла находятся в одном приложении, выдается ошибка.Я не понимаю, что происходит не так.

Я даже пытался «из ветви импорта Student.models / website.models», но затем он показывает неразрешенную ссылочную ветвь.

Структура каталога выглядит следующим образом: -

StudentExam
  -venv
  -website
     -Student
        -migrations
        -__init__.py
        -admin.py
        -apps.py
        -models.py
        -tests.py
        -urls.py
        -validators.py
        -views.py
     -website
        -__init__.py
        -settings.py
        -urls.py
        -wsgi.py
     -db.sqlite3
     -manage.py

validators.py: -

from django.core.exceptions import ValidationError
from .models import Branch

def increment_id():
    last_branch_id = Branch.objects.all().order_by('id').last()
    new_branch_id = last_branch_id + 1
    return new_branch_id

models.py: -

from django.db import models
from .validators import validate_sem,cie_out_of,ese_out_of,increment_id

class Branch(models.Model):
    branchID = models.PositiveSmallIntegerField(primary_key = True, serialize = True, validators = increment_id())
    branchName = models.CharField(max_length = 30)

    objects = models.Manager()

    def __str__(self):
        return ', '.join('{} = {}'.format(key, value) for key, value in self.__dict__.items() if key != "_state")

1 Ответ

0 голосов
/ 06 июня 2019

Краткий ответ : используйте взамен AutoField или не указывайте первичный ключ вообще: Django автоматически создаст один с именем id.

Вы делаете круговой импорт здесь: ваш модуль models зависит от вашего validators, и наоборот.

Однако вы можете лениво загрузить модуль models, импортировав его вincrement_id:

# app/validators.py

from django.core.exceptions import ValidationError

def increment_id():
    <b>from .models import Branch</b>
    last_branch_id = Branch.objects.all().order_by(<b>'BranchId'</b>).last().<b>BranchId</b>
    new_branch_id = last_branch_id + 1
    return new_branch_id

В ваших моделях вы можете работать с:

# app/models.py

class Branch(models.Model):
    branchID = models.PositiveSmallIntegerField(primary_key=True, serialize=True, <b>default=increment_id</b>)

Обратите внимание, что это не валидатор, вы здесьиметь значение по умолчанию.Более того, вы должны , а не написать: Django имеет AutoField [Django-doc] , что:

IntegerField, которое автоматически увеличивает в соответствии с доступными идентификаторами.Вам обычно не нужно использовать это напрямую ;поле первичного ключа будет автоматически добавлено в вашу модель, если вы не укажете иное.См. Автоматические поля первичного ключа.

Таким образом, вы можете лучше определить это как:

class Branch(models.Model):
    <b>branch_id</b> = <b>models.AutoField(primary_key=True)</b>
    # ...

В соответствии с Руководством по стилю PEP-8 Кроме того, рекомендуется именовать атрибуты с помощью lowercase_with_underscores, поэтому branch_id вместо branchId.

Кроме того, обычно нет смысла называть именапервичный ключ, отличный от id.Приставив префикс к branch_id, вы можете меньше использовать duck, набрав .Так что, возможно, было бы лучше полностью пропустить это поле, поскольку документация по Полям автоматического первичного ключа говорит :

По умолчанию Django даеткаждая модель имеет следующее поле :

id = models.AutoField(primary_key=True)

Это первичный ключ с автоинкрементом.

Если вы хотите указать настраиваемый первичный ключ, просто укажите primary_key=Trueна одном из ваших полей.Если Django видит , который вы явно задали Field.primary_key, он не добавит автоматический id столбец .

Так что, если у вас нетхорошая причина указать один из них, вы можете просто перечислить столбцы данных:

class Branch(models.Model):
    # ...
    # other non-pk fields
...