django筛选查询集原因';AppRegistryNotReady:模型不可用;还没有上膛;使用models.py中的表单
在当前django项目(django 1.7.1)的开发过程中,我们完成了将一些数据库条目标记为已删除的任务,并将它们从用户的视线中删除,但不能完全从数据库中删除 我找到了一个快速简单的解决方案(正是我们想要做的!) 按照django logicaldelete的指示,我安装了带有pip的logicaldelete,并将其作为已安装的应用添加到settings.py 唯一剩下的就是在models.py和admin.py中添加logicaldelete并从中继承django筛选查询集原因';AppRegistryNotReady:模型不可用;还没有上膛;使用models.py中的表单,django,filtering,python-3.4,django-queryset,Django,Filtering,Python 3.4,Django Queryset,在当前django项目(django 1.7.1)的开发过程中,我们完成了将一些数据库条目标记为已删除的任务,并将它们从用户的视线中删除,但不能完全从数据库中删除 我找到了一个快速简单的解决方案(正是我们想要做的!) 按照django logicaldelete的指示,我安装了带有pip的logicaldelete,并将其作为已安装的应用添加到settings.py 唯一剩下的就是在models.py和admin.py中添加logicaldelete并从中继承 ... import logica
...
import logicaldelete
class MyModel(logicaldelete.models.Model){...}
...
到目前为止还不错:) 现在尝试运行项目会导致“AppRegistryNotReady:尚未加载模型”-错误:
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\django\db\models\options.py", line 414, in get_field_by_name
return self._name_map[name]
AttributeError: 'Options' object has no attribute '_name_map'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Python34\lib\site-packages\django\db\models\options.py", line 561, in get_all_related_m2m_objects_with_model
cache = self._related_many_to_many_cache
AttributeError: 'Options' object has no attribute '_related_many_to_many_cache'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\eclipse\workspacePraxis\promotionsdatenbank\manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Python34\lib\site-packages\django\core\management\__init__.py", line 385, in execute_from_command_line
utility.execute()
File "C:\Python34\lib\site-packages\django\core\management\__init__.py", line 354, in execute
django.setup()
File "C:\Python34\lib\site-packages\django\__init__.py", line 21, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:\Python34\lib\site-packages\django\apps\registry.py", line 108, in populate
app_config.import_models(all_models)
File "C:\Python34\lib\site-packages\django\apps\config.py", line 202, in import_models
self.models_module = import_module(models_module_name)
File "C:\Python34\lib\importlib\__init__.py", line 109, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
File "<frozen importlib._bootstrap>", line 1129, in _exec
File "<frozen importlib._bootstrap>", line 1471, in exec_module
File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
File "C:\eclipse\workspacePraxis\promotionsdatenbank\personen\models.py", line 144, in <module>
class PromovendChoice(forms.Form):
File "C:\eclipse\workspacePraxis\promotionsdatenbank\personen\models.py", line 149, in PromovendChoice
promovend_choice = forms.ModelChoiceField(queryset=Promovend.objects.all(), to_field_name='nachname', empty_label="Promovend")
File "C:\Python34\lib\site-packages\django\db\models\manager.py", line 191, in all
return self.get_queryset()
File "C:\Python34\lib\site-packages\logicaldelete\managers.py", line 15, in get_queryset
return LogicalDeleteQuerySet(self.model, using=self._db).filter(date_removed__isnull=True)
File "C:\Python34\lib\site-packages\django\db\models\query.py", line 691, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Python34\lib\site-packages\django\db\models\query.py", line 709, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "C:\Python34\lib\site-packages\django\db\models\sql\query.py", line 1287, in add_q
clause, require_inner = self._add_q(where_part, self.used_aliases)
File "C:\Python34\lib\site-packages\django\db\models\sql\query.py", line 1314, in _add_q
current_negated=current_negated, connector=connector)
File "C:\Python34\lib\site-packages\django\db\models\sql\query.py", line 1138, in build_filter
lookups, parts, reffed_aggregate = self.solve_lookup_type(arg)
File "C:\Python34\lib\site-packages\django\db\models\sql\query.py", line 1076, in solve_lookup_type
_, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
File "C:\Python34\lib\site-packages\django\db\models\sql\query.py", line 1339, in names_to_path
field, model, direct, m2m = opts.get_field_by_name(name)
File "C:\Python34\lib\site-packages\django\db\models\options.py", line 416, in get_field_by_name
cache = self.init_name_map()
File "C:\Python34\lib\site-packages\django\db\models\options.py", line 445, in init_name_map
for f, model in self.get_all_related_m2m_objects_with_model():
File "C:\Python34\lib\site-packages\django\db\models\options.py", line 563, in get_all_related_m2m_objects_with_model
cache = self._fill_related_many_to_many_cache()
File "C:\Python34\lib\site-packages\django\db\models\options.py", line 577, in _fill_related_many_to_many_cache
for klass in self.apps.get_models():
File "C:\Python34\lib\functools.py", line 428, in wrapper
result = user_function(*args, **kwds)
File "C:\Python34\lib\site-packages\django\apps\registry.py", line 168, in get_models
self.check_models_ready()
File "C:\Python34\lib\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.
是的。在这里,我不需要添加这些行。
尝试将其添加到logicaldelete.managers.py和logicaldelete.query.py中
看来我搞错了问题的原因
错误回溯中显示的我自己代码的唯一部分是表单中的此调用:
promovend_choice = forms.ModelChoiceField(queryset=Promovend.objects.all(), to_field_name='nachname', empty_label="Promovend")
希望你知道解决这个问题的方法
如果没有,我将重写delete方法并自己添加一个管理器
第3次更新
我自己实现了一个基本模型和一个合适的管理器(它与logicaldelete几乎没有区别)
不幸的是,同样的错误也发生了。在mymanagers.py文件中导入django并调用django.setup()也不起作用 给(白手起家的)经理打电话时出现问题
objects = SoftDeleteManager(False)
objects_deleted = SoftDeleteManager(True)
all_objects = models.Manager()
似乎SoftDeleteManger尚未准备好(加载),而我的模型想要引用它
更新第4号
新发现:
暗示错误存在于我的表格中并没有那么糟糕!我想知道在标准管理器中使用queryset=model.objects.all()
效果很好,用我的SoftDeleteManager替换它会导致错误
这个想法出现了:为什么不使用标准管理器在代码行中添加一个过滤器呢?
queryset=models.objects.all().filter(deleted=False)
该代码还导致AppRegistryNotReady错误-因此根本原因似乎是在我自制的管理器中过滤查询集
编辑
我发现过滤查询集也存在类似的问题。
但正如上面提到的,我尝试使用import django
和django.setup()
但没有成功
更新第5号
在读了一百遍之后,调用django.setup()
可以解决我在models.py中调用它时遇到的问题,我希望它会出错或成功运行。。。但什么也没发生。运行该项目会创建一个python进程,但没有输出,开发服务器也不会启动
您好,
托比这似乎是那个图书馆的问题。我建议您实现自己的逻辑删除(使用LogicalDeleteManager和LogicalDeleteModel相当容易),或者使用较低版本的django 作为一个简单的例子:
class MyLogicalDeleteManager(models.Manager):
def __init__(self, show_deleted_objects=False)
super(MyLogicalDeleteManager, self).__init__()
self.show_deleted_objects = show_deleted_objects
def get_queryset(self):
qs = super(MyLogicalDeleteManager, self).get_queryset()
return qs.filter(deleted=self.show_deleted_objects)
class MyLogicalDeleteModel(models.Model):
deleted = models.BooleanField(default=False)
objects = MyLogicalDeleteManager(False)
deleted_objects = MyLogicalDeleteManager(True)
all_objects = models.Manager()
def delete(self):
# Maybe check FK constraints with self._meta.get_all_related_objects()
self.deleted = True
self.save()
最后,我在前一篇文章的某个地方找到了一个“隐藏”的解决方案(不幸的是,我丢失了源代码):
my models.py中曾经有django.form。假设表单的命令导致错误,我将重新构建我的应用程序,并为该表单创建一个单独的forms.py文件。最后,它的工作性能 希望通过那一步。。。它的计划与您的解决方案大致相同-代码示例为thx:)这需要一些时间,但我发现从长远来看,让这些事情完全按照您想要的方式工作会更容易:)不幸的是,编写我自己的BaseModel和Manager也不起作用:/相同的错误发生了。。。想想我自己调用“objects.all()”的表单崩溃了——但我不知道这有什么奇怪的。。。你最近升级过django吗?错误是发生在每个型号上还是只发生在新型号上?最终找到了解决方案-thx,感谢您的时间和帮助。我想我没有发现没有你的“动机”去玩一些代码行。你不需要在该文件中调用django.setup(),我认为问题在于使用的代码依赖于models.py文件中的模型。django在引导程序上加载所有这些文件,但它们在请求时没有准备好。您的权利<代码>django.setup()不是必需的。。。django世界变得更加清晰。又是Thx。
class SoftDeleteBaseModel(models.Model):
deleted = models.BooleanField(default=False)
objects = SoftDeleteManager(False)
objects_deleted = SoftDeleteManager(True)
all_objects = models.Manager()
def delete(self):
related_models = [relation.get_accessor_name() for relation in self._meta.get_all_related_objects()]
for model_objects in rleated_models:
related_objects = getattr(self, model_objects).all()
for related_object in related_objects:
if not issubclass(related_object.__class__, SoftDeleteBaseModel):
break
related_object.delete()
self.deleted= True
self.save()
class Meta:
abstract = True
class SoftDeleteManager(models.Manager):
def __init__(self, show_deleted=False):
super(SoftDeleteManager, self).__init__()
self.show_deleted = show_deleted
def get_queryset(self):
qs = super(SoftDeleteManager, self).get_queryset()
return qs.filter(deleted=self.show_deleted)
objects = SoftDeleteManager(False)
objects_deleted = SoftDeleteManager(True)
all_objects = models.Manager()
class MyLogicalDeleteManager(models.Manager):
def __init__(self, show_deleted_objects=False)
super(MyLogicalDeleteManager, self).__init__()
self.show_deleted_objects = show_deleted_objects
def get_queryset(self):
qs = super(MyLogicalDeleteManager, self).get_queryset()
return qs.filter(deleted=self.show_deleted_objects)
class MyLogicalDeleteModel(models.Model):
deleted = models.BooleanField(default=False)
objects = MyLogicalDeleteManager(False)
deleted_objects = MyLogicalDeleteManager(True)
all_objects = models.Manager()
def delete(self):
# Maybe check FK constraints with self._meta.get_all_related_objects()
self.deleted = True
self.save()