我有以下代码:
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