Search code examples
pythondjangodjango-modelsforeign-keys

Django-models aren't loaded yet after adding foreignkey


I have looked similar questions in stackoverflow everywhere but nothing helped. My code worked great until I added a foreignkey to one of my models. This is the newly added line:

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

My full models.py looks like this:

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')

After that, when I hit python manage.py makemigrations, The error comes up. Here is a full traceback(note, my code in this question is simplified version of the original one) :

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/username/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/home/username/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/core/management/__init__.py", line 377, in execute
django.setup()
File "/home/username/.virtualenvs/djangodev/lib/python3.6/site-packages/django/__init__.py", 
line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/username/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/apps/registry.py", line 114, in populate
app_config.import_models()
File "/home/username/.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/username/Documents/book/learn- 
django/cs/django_project/page/models.py", line 46, in <module>
class Photo(models.Model):
File "/home/username/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/username/.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/username/.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/username/.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/username/.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/username/.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/username/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/sql/query.py", line 1371, in _add_q
check_filterable=check_filterable,
File "/home/username/.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/username/.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/username/.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/username/.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/username/.virtualenvs/djangodev/lib/python3.6/site- 
packages/django/db/models/fields/related.py", line 95, in related_model
apps.check_models_ready()
File "/home/username/.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.

What can I do to solve this? Any help will be much much appreciated.


Solution

  • You cannot (at the very least should not) evaluate ORM queries on module level, e.g. in class and field definitions. For your case you could just use the pk as default:

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

    But, as pointed out in the comments, you can also use a callable as default:

    def get_default_page():
        return Page.objects.get(foo=bar)
    
    # ...
    page = models.ForeignKey(Page, on_delete=models.CASCADE, default=get_default_page)