当我在外键中添加默认值时,";django.core.exceptions.AppRegistryNotReady:模型不可用';“我还没装。”;发生

当我在外键中添加默认值时,";django.core.exceptions.AppRegistryNotReady:模型不可用';“我还没装。”;发生,django,django-models,wagtail,Django,Django Models,Wagtail,我正在开发Django&Wagtail博客应用程序 不幸的是,django.core.exceptions.AppRegistryNotReady:模型尚未加载。发生 如果没有默认设置,应用程序将正常工作。但是,如果我添加了默认值,它将不起作用 我研究了一些文章,但他们帮不了我 class hoge(models.Model): """ ... """ page = models.ForeignKey( "blog.BlogIndexPage",

我正在开发Django&Wagtail博客应用程序

不幸的是,
django.core.exceptions.AppRegistryNotReady:模型尚未加载。
发生

如果没有默认设置,应用程序将正常工作。但是,如果我添加了默认值,它将不起作用

我研究了一些文章,但他们帮不了我

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文档:

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

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

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时可用的最新
bloginexpage
。如果一个人在服务器向您发送表单和您的
submit
操作之间创建新的
bloginexpage
,则
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()
参考:和来自Django文档的

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

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

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时可用的最新
bloginexpage
。如果一个人在服务器向您发送表单和您的
submit
操作之间创建新的
bloginexpage
,则
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()
参考:及