Django - Невозможно импортировать модель другого приложения из той же директории
У меня возникла проблема с импортом модели из другого приложения для внешнего ключа. Я пробовал два способа использовать поле из другой модели:
Импортируем его как строку, это не дает никаких ошибок перед миграцией модели:
from_city = models.ForeignKey('cities.City', blank=True,
null=True, related_name='from_city_set',
on_delete=models.CASCADE)
Выдает ошибку, когда я пытаюсь использовать команду "makekigrations" или "migrate"
Импортируем его как объект 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
)
Наконец-то! Я решил эту проблему:
- Удалите файл вашей БД .
- Удалите все из папки migrations в каждом приложении, кроме файла 'init.py'
- Запустите команды 'python manage.py makemigrations' и 'python manage.py migrate' .
- Проблема решена!
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
)