django筛选查询集原因';AppRegistryNotReady:模型不可用;还没有上膛;使用models.py中的表单

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

在当前django项目(django 1.7.1)的开发过程中,我们完成了将一些数据库条目标记为已删除的任务,并将它们从用户的视线中删除,但不能完全从数据库中删除

我找到了一个快速简单的解决方案(正是我们想要做的!)

按照django logicaldelete的指示,我安装了带有pip的logicaldelete,并将其作为已安装的应用添加到settings.py

唯一剩下的就是在models.py和admin.py中添加logicaldelete并从中继承

...
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()