当我在外键中添加默认值时,“ django.core.exceptions.AppRegistryNotReady:模型尚未加载。”发生

时间:2019-08-14 07:01:31

标签: django wagtail

我正在开发Django&Wagtail博客应用程序。 不幸的是,“ django.core.exceptions.AppRegistryNotReady:模型尚未加载。”发生了。

如果没有默认设置,则应用正常运行。但是,如果我添加了默认设置,它将无法正常工作...

我研究了一些文章,但他们无济于事。

p = np.linspace(1/253, 253/253, 253)

b = 0.5
phi_p = np.power((b * p), (b-1))

plt.plot(p, phi_p)
plt.xlabel('p')
plt.ylabel('\u03A6(p)')
plt.title(' ')
plt.show()

环境: Mac(Mojave 10.14.6) 虚拟环境 python 3.7 的Django 2.2.4 2.6.1

错误: django.core.exceptions.AppRegistryNotReady:模型尚未加载。

2 个答案:

答案 0 :(得分:2)

您不能在字段定义内进行类似的查询,因为它们是在导入时执行的,而其他模型尚未初始化。

您应该删除该默认设置;您可以在创建页面对象或视图的表单中设置默认页面。

答案 1 :(得分:0)

摘自Django文档Field.default

该字段的默认值。这可以是值或可调用对象。如果可以调用,则每次创建新对象时都会调用它。

因此只需将其更改为可调用对象,如下所示:

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可用。如果有人在服务器之间创建新的BlogIndexPage,并且服务器将表单发送给您,而您的submit操作,则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.cleanModelForm validation