添加外键后尚未加载 Django 模型



我在stackoverflow中到处查找过类似的问题,但没有任何帮助。我的代码工作得很好,直到我为我的一个模型添加了外键。这是新增加的一行:

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

我的完整模型.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/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.

我能做些什么来解决这个问题?任何帮助都将不胜感激。

您不能(至少不应该(在模块级别评估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)

最新更新