【问题标题】:When calling delete(), I get 'models aren't loaded yet' error in Django 2.0.3调用 delete() 时,在 Django 2.0.3 中出现“尚未加载模型”错误
【发布时间】:2018-03-29 16:03:26
【问题描述】:

我在一个名为 coin 的应用中定义了两个模型。

models.py
from django.db import models

class Coin(models.Model):
   model defintions

class CoinData(models.Model):
     model defintions

我有一个函数可以使用 for 循环将数据写入我的 Coin 模型(在 models.py 中)

models.py
for each_item in list:
 each_item = Coin(name=each_item)

这很好用,但每次我写入模型时,它都会创建一个额外的实例,即使一个已经存在。当我优化我的代码时,我只想删除 Coin 中的所有实例。列表是 1500+,所以我无法从 Admin 中删除(这确实有效,但如果我尝试一次删除所有实例,则会产生错误)。

所以我在 Coins 中的对象上运行 delete() 函数的许多变体:

Coin.objects.all().delete()

或者

for x in Coin.objects.all()
 x.delete()

只有当我调用 delete() 时才会收到错误

    File "C:\Anaconda\lib\site-packages\django\utils\autoreload.py", line 248, in raise_last_exception
    raise _exception[1]
  File "C:\Anaconda\lib\site-packages\django\core\management\__init__.py", line 327, in execute
    autoreload.check_errors(django.setup)()
  File "C:\Anaconda\lib\site-packages\django\utils\autoreload.py", line 225, in wrapper
    fn(*args, **kwargs)
  File "C:\Anaconda\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Anaconda\lib\site-packages\django\apps\registry.py", line 112, in populate
    app_config.import_models()
  File "C:\Anaconda\lib\site-packages\django\apps\config.py", line 198, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Anaconda\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\mypython\crypt\coins\models.py", line 31, in <module>
    Coin.objects.all().delete()
  File "C:\Anaconda\lib\site-packages\django\db\models\query.py", line 661, in delete
    collector.collect(del_query)
  File "C:\Anaconda\lib\site-packages\django\db\models\deletion.py", line 186, in collect
    if self.can_fast_delete(objs):
  File "C:\Anaconda\lib\site-packages\django\db\models\deletion.py", line 146, in can_fast_delete
    for related in get_candidate_relations_to_delete(opts):
  File "C:\Anaconda\lib\site-packages\django\db\models\deletion.py", line 58, in get_candidate_relations_to_delete
    f for f in opts.get_fields(include_hidden=True)
  File "C:\Anaconda\lib\site-packages\django\db\models\options.py", line 735, in get_fields
    return self._get_fields(include_parents=include_parents, include_hidden=include_hidden)
  File "C:\Anaconda\lib\site-packages\django\db\models\options.py", line 797, in _get_fields
    all_fields = self._relation_tree
  File "C:\Anaconda\lib\site-packages\django\utils\functional.py", line 36, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Anaconda\lib\site-packages\django\db\models\options.py", line 708, in _relation_tree
    return self._populate_directed_relation_graph()
  File "C:\Anaconda\lib\site-packages\django\db\models\options.py", line 679, in _populate_directed_relation_graph
    all_models = self.apps.get_models(include_auto_created=True)
  File "C:\Anaconda\lib\site-packages\django\apps\registry.py", line 170, in get_models
    self.check_models_ready()
  File "C:\Anaconda\lib\site-packages\django\apps\registry.py", line 132, in check_models_ready
    raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

我的对象上的其他方法,例如 all() 和 save() 似乎工作得很好?

【问题讨论】:

  • 我应该说数据库是SQlite,我从manage.py runserver运行服务器
  • 问题,你为什么要删除所有记录?是为了测试应用程序,还是服务于真正的生产目的?如果这是生产目的,我会创建一个自定义 shell 管理命令来执行此操作。因此,您不必启动该文件来删除硬币。如果它是用于测试环境(我假设)仍在创建命令 - 甚至删除 django 创建的 sqllite 数据库将是一条简单的路线。但是无论如何,学习 django 管理 shell 对你的应用程序开发来说都是至关重要的,所以继续吧.... b

标签: python django django-2.0


【解决方案1】:

您的models.py 不应包含在加载模块时运行查询的代码。这包括其他查询,例如 Coin.objects.all()coin.save()(即使它们尚未导致您出错)。看回溯,可以看出是删除时处理相关对象的代码导致了错误。

我会从您的模型中删除 delete() 调用,并在 python manage.py shell 中运行它:

from coins.models import Coin
Coin.objects.all().delete()

另一种选择是创建一个management command,这样您就可以运行python manage.py delete_coins,但在这种情况下这太过分了。

作为开发过程中的黑客,您可以将 delete 放入您的 AppConfig.ready() 方法中,但请注意文档特别警告不要这样做。

【讨论】:

  • 我刚刚按照您的回答尝试过,但我不太记得是什么导致我尝试了它。您完全正确 - 非常感谢您的回复。
【解决方案2】:

在 Django 1.8 上尝试使用独立脚本删除所有对象时遇到类似问题:

Traceback (most recent call last):
  File "import_data.py", line 368, in <module>
    import_data_2018(workbook)
  File "import_data.py", line 283, in import_data_2018
    Estates2018.objects.all().delete()
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/db/models/query.py", line 536, in delete
    collector.collect(del_query)
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/db/models/deletion.py", line 193, in collect
    if self.can_fast_delete(objs):
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/db/models/deletion.py", line 155, in can_fast_delete
    for related in get_candidate_relations_to_delete(opts):
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/db/models/deletion.py", line 67, in <genexpr>
    f for f in candidate_model_fields
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/db/models/deletion.py", line 62, in <genexpr>
    opts.get_fields(include_hidden=True) for opts in candidate_models
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/db/models/options.py", line 740, in get_fields
    return self._get_fields(include_parents=include_parents, include_hidden=include_hidden)
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/db/models/options.py", line 802, in _get_fields
    all_fields = self._relation_tree
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/utils/functional.py", line 60, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/db/models/options.py", line 709, in _relation_tree
    return self._populate_directed_relation_graph()
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/db/models/options.py", line 681, in _populate_directed_relation_graph
    all_models = self.apps.get_models(include_auto_created=True)
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/utils/lru_cache.py", line 101, in wrapper
    result = user_function(*args, **kwds)
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/apps/registry.py", line 168, in get_models
    self.check_models_ready()
  File "/home/joao/.ve/estates/local/lib/python2.7/site-packages/django/apps/registry.py", line 131, in check_models_ready
    raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

基于这个issue 我已经设法修复它,将以下内容添加到脚本中:

from django import setup as django_setup

django_setup()  # Call it before running anything else on your script

希望这可以帮助遇到同样问题的人

【讨论】:

    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2018-11-07
    • 2014-10-21
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多