默认的 Django 外键 -- 应用程序注册表尚未准备就绪



我有以下代码:

class A(models.Model):
  foo = models.DateField(blank=False, null=False)
  class Meta:
    get_latest_by = 'foo'

class B(models.Model):
  bar = models.ForeignKey(A, default=A.objects.latest())

根据文档,这是包括不同模型的最新对象的默认值的方法。

无论我尝试运行应用程序(python manage.py runserver)还是执行迁移(python manage.py makemigrations),我都会得到以下回溯:

Traceback (most recent call last):
  File "/home/bla/workspace/foobar/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/lib64/python2.7/site-packages/django/core/management/__init__.py", line 427, in execute_from_command_line
    utility.execute()
  File "/usr/lib64/python2.7/site-packages/django/core/management/__init__.py", line 391, in execute
    django.setup()
  File "/usr/lib64/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/lib64/python2.7/site-packages/django/apps/registry.py", line 106, in populate
    app_config.import_models(all_models)
  File "/usr/lib64/python2.7/site-packages/django/apps/config.py", line 190, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/bla/workspace/foobar/b/models.py", line 15, in <module>
    class B(models.Model):
  File "/home/bla/workspace/foobar/b/models.py", line 54, in B
    bar = models.ForeignKey(A, blank=True, null=True, default=A.objects.latest()) # @UndefinedVariable
  File "/usr/lib64/python2.7/site-packages/django/db/models/manager.py", line 92, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 497, in latest
    return self._earliest_or_latest(field_name=field_name, direction="-")
  File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 491, in _earliest_or_latest
    return obj.get()
  File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 346, in get
    num = len(clone)
  File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 122, in __len__
    self._fetch_all()
  File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 963, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/usr/lib64/python2.7/site-packages/django/db/models/query.py", line 265, in iterator
    for row in compiler.results_iter():
  File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 694, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 769, in execute_sql
    sql, params = self.as_sql()
  File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 100, in as_sql
    ordering, o_params, ordering_group_by = self.get_ordering()
  File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 424, in get_ordering
    self.query.get_meta(), default_order=asc):
  File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 460, in find_ordering_name
    field, targets, alias, joins, path, opts = self._setup_joins(pieces, opts, alias)
  File "/usr/lib64/python2.7/site-packages/django/db/models/sql/compiler.py", line 492, in _setup_joins
    pieces, opts, alias)
  File "/usr/lib64/python2.7/site-packages/django/db/models/sql/query.py", line 1416, in setup_joins
    names, opts, allow_many, fail_on_missing=True)
  File "/usr/lib64/python2.7/site-packages/django/db/models/sql/query.py", line 1336, in names_to_path
    field, model, direct, m2m = opts.get_field_by_name(name)
  File "/usr/lib64/python2.7/site-packages/django/db/models/options.py", line 415, in get_field_by_name
    cache = self.init_name_map()
  File "/usr/lib64/python2.7/site-packages/django/db/models/options.py", line 444, in init_name_map
    for f, model in self.get_all_related_m2m_objects_with_model():
  File "/usr/lib64/python2.7/site-packages/django/db/models/options.py", line 560, in get_all_related_m2m_objects_with_model
    cache = self._fill_related_many_to_many_cache()
  File "/usr/lib64/python2.7/site-packages/django/db/models/options.py", line 574, in _fill_related_many_to_many_cache
    for klass in self.apps.get_models():
  File "/usr/lib64/python2.7/site-packages/django/utils/lru_cache.py", line 101, in wrapper
    result = user_function(*args, **kwds)
  File "/usr/lib64/python2.7/site-packages/django/apps/registry.py", line 156, in get_models
    self.check_ready()
  File "/usr/lib64/python2.7/site-packages/django/apps/registry.py", line 119, in check_ready
    raise RuntimeError("App registry isn't ready yet.")
RuntimeError: App registry isn't ready yet.

我的设置文件包含INSTALLED_APPS中的应用程序(A 和 B)。

我正在使用 Django 版本 1.7a2。同样,文档对此错误有一些内容: RuntimeError: App registry isn't ready yet. This happens when importing an application configuration or a models module triggers code that depends on the app registry.

但是我不知道如何将其相应地应用于我的模型。

任何帮助,不胜感激。谢谢

我倾向于认为 django 首先验证模型类,然后才允许您访问数据库中的值。

另请注意,示例中的代码意味着默认情况下,您将在应用程序启动时获得最新的 A 值。无论您要添加什么新的 A 记录 - 默认栏都绑定到这个旧值。

如果你想动态查找最新的 A(我认为你是),你应该传递一个可调用的而不是值。

尝试用这个替换栏(注意括号被删除):

bar = models.ForeignKey(A, default=A.objects.latest)

我不知道创建 B 时 A 中是否已经有"对象"成员,所以我建议您使用更详细但可靠的方式:

def latest_A():
    return A.objects.latest()
class B(models.Model):
    bar = models.ForeignKey(A, default=latest_A)

为了看到差异,您的代码等效项如下所示:

latest_A_on_start = A.objects.latest() # got it only once
class B(models.Model):
    bar = models.ForeignKey(A, default=latest_A_on_start) #it s just "static" value

最新更新