Django -модели еще не загружены после добавления foreignkey - PullRequest
0 голосов
/ 25 марта 2020

Я смотрел похожие вопросы в stackoverflow везде, но ничего не помогло. Мой код работал отлично, пока я не добавил посторонний ключ к одной из моих моделей. Это новая добавленная строка:

page = models.ForeignKey(Page, on_delete=models.CASCADE, default=Page.objects.get(pk=7).pk)

Мой полный файл models.py выглядит следующим образом:

class Page(Group):
    pagenumber = models.IntegerField()
    pagename = models.CharField()

class Photo(models.Model):
    page = models.ForeignKey(Page, on_delete=models.CASCADE, default=Page.objects.get(pk=7).pk)
    file = models.FileField(upload_to='photos')

После этого, когда я нажимаю python manage.py makemigrations, появляется ошибка. Вот полный ответ (обратите внимание, мой код в этом вопросе является упрощенной версией исходного):

Traceback (most recent call last):
File "manage.py", line 21, in <module>
main()
File "manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/core/management/__init__.py", line 377, in execute
django.setup()
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site-packages/django/__init__.py", 
line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/apps/registry.py", line 114, in populate
app_config.import_models()
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site-packages/django/apps/config.py", 
line 211, in import_models
self.models_module = import_module(models_module_name)
File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/home/abrar/Documents/book/learn- 
django/cs/django_project/page/models.py", line 46, in <module>
class Photo(models.Model):
File "/home/abrar/Documents/book/learn- 
django/cs/django_project/page/models.py", line 48, in Photo
page = models.ForeignKey(Page, on_delete=models.CASCADE, default=Page.objects.get(pk=7))
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/query.py", line 404, in get
clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/query.py", line 904, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/query.py", line 923, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/sql/query.py", line 1340, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/sql/query.py", line 1371, in _add_q
check_filterable=check_filterable,
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/sql/query.py", line 1240, in build_filter
lookups, parts, reffed_expression = self.solve_lookup_type(arg)
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/sql/query.py", line 1077, in solve_lookup_type
_, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/sql/query.py", line 1449, in names_to_path
if field.is_relation and not field.related_model:
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/utils/functional.py", line 48, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/fields/related.py", line 95, in related_model
apps.check_models_ready()
File "/home/abrar/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/apps/registry.py", line 140, in check_models_ready
raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

Что я могу сделать, чтобы решить эту проблему? Любая помощь будет высоко ценится.

1 Ответ

2 голосов
/ 25 марта 2020

Вы не можете (по крайней мере, не должны) оценивать запросы ORM на уровне модуля, например, в определениях классов и полей. Для вашего случая вы можете просто использовать pk по умолчанию:

page = models.ForeignKey(Page, on_delete=models.CASCADE, default=7)

Но, как указано в комментариях, вы также можете использовать вызываемый по умолчанию:

def get_default_page():
    return Page.objects.get(foo=bar)

# ...
page = models.ForeignKey(Page, on_delete=models.CASCADE, default=get_default_page)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...