当我在外键中添加默认值时,发生 "django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet."
When I added default in foreign-key, "django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet." occurred
我正在开发 Django&Wagtail 博客应用程序。
不幸的是,django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
发生了。
如果没有默认,应用程序可以正常运行。但是,如果我添加默认值,它不起作用...
我研究了一些文章,但他们帮不了我。
class hoge(models.Model):
"""
...
"""
page = models.ForeignKey(
"blog.BlogIndexPage", on_delete=models.CASCADE,
verbose_name=_("blog"),
default=BlogIndexPage.objects.latest("id"), # add here
)
环境:
Mac(Mojave 10.14.6)
Virtualenv
python 3.7
Django 2.2.4
wagtail 2.6.1
错误:
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
您不能在字段定义中执行类似的查询,因为它们是在导入时执行的,此时其他模型尚未初始化。
您应该删除该默认值;您可以在创建页面对象或视图的表单中设置默认页面。
来自 Django 文档 Field.default:
The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.
所以只需将其更改为这样的可调用对象:
def get_hoge_page_default():
return BlogIndexPage.objects.earliest('id', '-id')
class Hoge(models.Model):
page = models.ForeignKey(
"blog.BlogIndexPage", on_delete=models.CASCADE,
verbose_name=_("blog"),
default=get_hoge_page_default(),
)
警告:这种方法可能会导致出现竞争条件 - 假设您在 Django 管理面板中试图创建新的 Hoge
对象。在表单上,当服务器为您生成 HTML 时,您将看到最新的 BlogIndexPage
可用。如果有人在服务器向您发送表单和您的 submit
操作之间创建新的 BlogIndexPage
,则 Hoge.page
中的值将不是最新的!
我想向您展示一个更好的方法:
def get_hoge_page_default():
return BlogIndexPage.objects.earliest('id', '-id')
class Hoge(models.Model):
page = models.ForeignKey(
"blog.BlogIndexPage", on_delete=models.CASCADE,
verbose_name=_("blog"),
null=True,
)
def clean(self):
if self.id is None and self.page is None:
self.page = get_hoge_page_default()
参考:Model.clean and ModelForm validation
我正在开发 Django&Wagtail 博客应用程序。
不幸的是,django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
发生了。
如果没有默认,应用程序可以正常运行。但是,如果我添加默认值,它不起作用...
我研究了一些文章,但他们帮不了我。
class hoge(models.Model):
"""
...
"""
page = models.ForeignKey(
"blog.BlogIndexPage", on_delete=models.CASCADE,
verbose_name=_("blog"),
default=BlogIndexPage.objects.latest("id"), # add here
)
环境:
Mac(Mojave 10.14.6)
Virtualenv
python 3.7
Django 2.2.4
wagtail 2.6.1
错误:
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
您不能在字段定义中执行类似的查询,因为它们是在导入时执行的,此时其他模型尚未初始化。
您应该删除该默认值;您可以在创建页面对象或视图的表单中设置默认页面。
来自 Django 文档 Field.default:
The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.
所以只需将其更改为这样的可调用对象:
def get_hoge_page_default():
return BlogIndexPage.objects.earliest('id', '-id')
class Hoge(models.Model):
page = models.ForeignKey(
"blog.BlogIndexPage", on_delete=models.CASCADE,
verbose_name=_("blog"),
default=get_hoge_page_default(),
)
警告:这种方法可能会导致出现竞争条件 - 假设您在 Django 管理面板中试图创建新的 Hoge
对象。在表单上,当服务器为您生成 HTML 时,您将看到最新的 BlogIndexPage
可用。如果有人在服务器向您发送表单和您的 submit
操作之间创建新的 BlogIndexPage
,则 Hoge.page
中的值将不是最新的!
我想向您展示一个更好的方法:
def get_hoge_page_default():
return BlogIndexPage.objects.earliest('id', '-id')
class Hoge(models.Model):
page = models.ForeignKey(
"blog.BlogIndexPage", on_delete=models.CASCADE,
verbose_name=_("blog"),
null=True,
)
def clean(self):
if self.id is None and self.page is None:
self.page = get_hoge_page_default()
参考:Model.clean and ModelForm validation