Django - Невозможно импортировать модель другого приложения из той же директории

У меня возникла проблема с импортом модели из другого приложения для внешнего ключа. Я пробовал два способа использовать поле из другой модели:

  1. Импортируем его как строку, это не дает никаких ошибок перед миграцией модели:

    from_city = models.ForeignKey('cities.City', blank=True,
    null=True, related_name='from_city_set',
    on_delete=models.CASCADE)

Выдает ошибку, когда я пытаюсь использовать команду "makekigrations" или "migrate"

  1. Импортируем его как объект python, но есть странный момент. Он пытается импортировать приложение 'city' из папки src следующим образом:

    from src.cities.models import City

    from_city = models.ForeignKey(City, blank=True, null=True, related_name='from_city_set', on_delete=models.CASCADE )

Оба варианта обеспечивают одинаковый отслеживание:

Traceback (most recent call last):


File "C:\TrainProject\src\manage.py", line 22, in <module>
    main()
  File "C:\TrainProject\src\manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\TrainProject\venv\lib\site-packages\django\core\management\__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "C:\TrainProject\venv\lib\site-packages\django\core\management\__init__.py", line 440, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\TrainProject\venv\lib\site-packages\django\core\management\base.py", line 402, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\TrainProject\venv\lib\site-packages\django\core\management\base.py", line 448, in execute
    output = self.handle(*args, **options)
  File "C:\TrainProject\venv\lib\site-packages\django\core\management\base.py", line 96, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\TrainProject\venv\lib\site-packages\django\core\management\commands\makemigrations.py", line 196, in handle
    loader.project_state(),
  File "C:\TrainProject\venv\lib\site-packages\django\db\migrations\loader.py", line 361, in project_state
    return self.graph.make_state(
  File "C:\TrainProject\venv\lib\site-packages\django\db\migrations\graph.py", line 329, in make_state
    project_state = self.nodes[node].mutate_state(project_state, preserve=False)
  File "C:\TrainProject\venv\lib\site-packages\django\db\migrations\migration.py", line 89, in mutate_state
    operation.state_forwards(self.app_label, new_state)
  File "C:\TrainProject\venv\lib\site-packages\django\db\migrations\operations\models.py", line 724, in state_forwards
    state.alter_model_options(
  File "C:\TrainProject\venv\lib\site-packages\django\db\migrations\state.py", line 182, in alter_model_options
    model_state = self.models[app_label, model_name]
KeyError: ('cities', 'city')

Как я могу решить эту проблему? Папка приложения 'train' в том же месте, что и папка приложения 'cities'.

UPD Установленные приложения:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cities',
'trains',]

Модели (города/модели и поезда/модели):

class City(models.Model):
    name = models.CharField(max_length=40, unique=True, verbose_name='Название города')

class Train(models.Model):
name = models.CharField(max_length=50, unique=True,
                        verbose_name='Название поезда')
travel_time = models.PositiveSmallIntegerField(verbose_name='Время в пути')
from_city = models.ForeignKey('cities.City', related_name='from_city_set',
                              on_delete=models.CASCADE
                              )
to_city = models.ForeignKey('cities.City', related_name='to_city_set',
                            on_delete=models.CASCADE
                            )

trains/models.py должен выглядеть следующим образом:

from cities.models import City

class Train(models.Model):
name = models.CharField(max_length=50, unique=True,
                        verbose_name='Название поезда')
travel_time = models.PositiveSmallIntegerField(verbose_name='Время в пути')
from_city = models.ForeignKey(City, related_name='from_city_set',
                              on_delete=models.CASCADE
                              )
to_city = models.ForeignKey(City, related_name='to_city_set',
                            on_delete=models.CASCADE
                            )

Наконец-то! Я решил эту проблему:

  1. Удалите файл вашей БД
  2. .
  3. Удалите все из папки migrations в каждом приложении, кроме файла 'init.py'
  4. Запустите команды 'python manage.py makemigrations' и 'python manage.py migrate'
  5. .
  6. Проблема решена!

UPD

Не имеет значения, как вы импортируете другую модель в поле ForeingKey, это может быть строка python или объект python (конечно, после импорта этой модели):

from_city = models.ForeignKey('cities.City', related_name='from_city_set',
                              on_delete=models.CASCADE
                              )
_______________________________________________________________________

from city.models import City

from_city = models.ForeignKey(City, related_name='from_city_set',
                                  on_delete=models.CASCADE
                                  )
Вернуться на верх