在我们当前的django-project(django 1.7.1)的开发过程中,我们完成了将一些数据库条目标记为已删除并将其从用户看不见但从数据库中完全删除的任务。
我找到了django-logicaldelete(这正是我们想要做的事!),这是一个快速简单的解决方案。
按照django-logicaldelete的指示,我使用pip安装了logicaldelete并将其作为INSTALLED_APP添加到settings.py
剩下的唯一事情就是在models.py和admin.py中添加逻辑删除
...
import logicaldelete
class MyModel(logicaldelete.models.Model){...}
...
...
import logicaldelete
class MyModelAdmin(logicaldelete.admin.ModelAdmin){...}
...
到目前为止一切顺利:)现在尝试运行项目会导致“ 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.
我从django 1.7起就读过这个问题并作为解决方案
import django
django.setup()
给出。在这里,我不添加这些行。试图将其添加到logicaldelete.managers.py和logicaldelete.query.py中
似乎我弄错了主意是什么导致了问题。
错误回溯中显示的我自己的代码的唯一部分是在表单内进行此调用:
promovend_choice = forms.ModelChoiceField(queryset=Promovend.objects.all(), to_field_name='nachname', empty_label="Promovend")
希望您知道解决此问题的方法...
如果没有,我将覆盖删除方法并自行添加一个管理器。
我已经实现了一个BaseModel和一个合适的Manager(与逻辑删除几乎没有区别)
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)
不幸的是,发生相同的错误。在我的manager.py文件中将调用django.setup()导入django也不起作用。
致电(自制)经理时遇到了一些问题
objects = SoftDeleteManager(False)
objects_deleted = SoftDeleteManager(True)
all_objects = models.Manager()
我的模型想要引用它时,似乎SoftDeleteManger尚未准备好(加载)。
新发现:
提示错误在于我的表单内,还不错!我想知道queryset = model.objects.all()
与标准管理器一起使用能正常工作,用我的SoftDeleteManager替换它会导致错误...
这个想法浮出水面:为什么不使用standard-manager向该代码行添加过滤器?queryset = models.objects.all().filter(deleted=False)
该代码也会导致AppRegistryNotReady错误-因此根本原因似乎是在我自制的Manager中过滤查询集...
我发现在此处过滤查询集存在类似问题。但是正如顶部所述,我尝试使用import django
并django.setup()
没有成功...
阅读一百次后,调用django.setup()
将解决问题,我在我的models.py中调用了它,期望发生错误或运行成功...但是什么也没有发生。运行项目会创建一个python进程,但没有输出,开发服务器也不会启动...
问候,Tobi
最终,我在之前的某个地方的帖子中找到了一个“隐藏”的解决方案(不幸的是,我丢失了源代码):
我的models.py中曾经有django.form。假设该表单的命令导致错误,我重新构建了我的应用程序并为该表单创建了一个单独的forms.py文件。终于,它的功能完美!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句