6

以下错误似乎在我的实时服务器上随机发生(即通过 apache mod_wsgi),但从未在开发中发生(即 localhost python manage.py runserver)。

请注意,这种情况很少发生,并且不是可以轻松复制或每次访问特定网址时都可以复制的内容。

我已经在 SO 和 google 上看到了各种答案,但似乎没有任何明确的原因说明为什么会发生此错误。也许这是因为错误相当普遍,但最常见的答案似乎是由于循环导入错误。我看到的另一个答案是模型 FK 字段引用不是正确的情况(例如 applabel.model 而不是 applabel.Model),但我所有的模型 FK 字段都是正确的。

错误的原因似乎指向我的 admin.py 文件之一。该文件最初确实从 forms.py 文件中导入了自定义表单类。admin.py 文件和 forms.py 文件都从 models.py 文件中导入了相同的模型。因此,我将表单类移动到 admin.py 文件中,以防此处发生循环引用,但我仍然偶尔会遇到这些错误。

谁能解释为什么会发生此错误以及为什么会如此随机?我始终确保在代码更新后重新启动相关服务。

追溯是:

Traceback (most recent call last):

File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 101, in get_response
request.path_info)

File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 250, in resolve
for pattern in self.url_patterns:

File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 279, in _get_url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)

File "/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.py", line 274, in _get_urlconf_module
self._urlconf_module = import_module(self.urlconf_name)

File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)

File "/myproject/urls.py", line 6, in <module>
admin.autodiscover()

File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/__init__.py", line 26, in autodiscover
import_module('%s.admin' % app)

File "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)

File "/myproject/myapps/app/admin.py", line 61, in <module>
class CardAdminForm(forms.ModelForm):

File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 205, in __new__
opts.exclude, opts.widgets, formfield_callback)

File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 159, in fields_for_model
formfield = f.formfield(**kwargs)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 913, in formfield
'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to),

AttributeError: 'str' object has no attribute '_default_manager'

包和版本

  • 警告:找不到 pymssql==2.0.0b1-dev-20111019 的 svn 位置
  • 警告:找不到分发的 svn 位置==0.6.24dev-r0
  • Django==1.3.3
  • GnuPGInterface==0.3.2
  • 景观客户端==12.05
  • PAM==0.4.2
  • 太平==1.1.7
  • 扭曲核心==11.1.0
  • apt-xapian-index==0.44
  • argparse==1.2.1
  • chardet==2.0.1
  • 命令未找到==0.2.44
  • ## FIXME:在此包的依赖链接中找不到 svn URL:distribute==0.6.24dev-r0
  • django-debug-toolbar==0.9.4
  • django-rosetta==0.6.8
  • httplib2==0.7.2
  • iotop==0.4.4
  • 钥匙圈==0.7.1
  • 语言选择器==0.1
  • 启动板库==1.9.12
  • lazr.restfulclient==0.12.0
  • lazr.uri==1.0.3
  • 水银==2.0.2
  • oauth==1.0.1
  • psycopg2==2.4.5
  • pyOpenSSL==0.12
  • pycrypto==2.4.1
  • ## FIXME:在此包的依赖链接中找不到 svn URL:pymssql==2.0.0b1-dev-20111019
  • pyserial==2.5
  • python-apt==0.8.3ubuntu7
  • python-debian==0.1.21ubuntu1
  • 报告实验室==2.5
  • simplejson==2.3.2
  • ufw==0.31.1-1
  • wadlib==1.3.0
  • wsgiref==0.1.2
  • xlwt==0.7.4
  • zope.interface==3.6.1

数据库:PostgreSQL 9.1.5

CardAdmin 和 CardAdminForm:

class CardAdmin(admin.ModelAdmin):
    form = CardAdminForm
    raw_id_fields = ('cust', 'acc', 'vehicle', 'driver')
    list_display = ('id', 'pan', 'name', 'expiry', 'created', 'modified')
    list_filter = ('status', )
    search_fields = ['id', 'pan']
admin.site.register(Card, CardAdmin)

class CardAdminForm(forms.ModelForm):
    """
    A Form for Cards (Admin console)
    """

    def __init__(self, *args, **kwargs):
        super(CardAdminForm, self).__init__(*args, **kwargs)
        self.fields['cust'].required = True
        self.fields['acc'].required = True
        self.fields['name'].required = True
        self.fields['code'].widget = forms.PasswordInput()
        self.fields['code'].max_length = 6

    class Meta:
        model = Card
        fields = (
            'cust',
            'name',
            'acc',
            'no',
            'code',
            'type',
            'status',
            'address_1',
            'address_2',
            'zip',
            'city',
            'country',
            'phone_no',
            'expiry',
            'vehicle',
            'driver'
        )

    def save(self, commit=True):
        # Save some additional data.
        form_instance = super(CardAdminForm, self).save(commit=False)

        cleaned_data = self.cleaned_data
        form_instance.pan = '%s%s%s'\
        % (
            cleaned_data['acc'].iso.number,
            cleaned_data['acc'].number,
            cleaned_data['no']
        )

        if commit:
            form_instance.save()
        return form_instance
4

6 回答 6

35

对于仍然发现这个旧问题的人们的快速说明:这种情况也可能是由使用无效字符串作为引用的 ForeignKey/ManyToMany/OnetoOne 引起的(例如:未正确指向模型)。

我正在更新/重构一个项目并遇到了这个问题。原来这只是一个错字。

有点奇怪的 django 没有明确通知它无法解析字符串,可能是因为其他应用程序混淆了它。

于 2016-01-08T15:09:43.040 回答
8

_default_manager是模型上的属性,它包含该模型的(惊喜,惊喜)默认管理器。Django 到处使用它,尤其是在管理员中,为 ModelAdmins 返回查询集。

所以错误告诉你在某个地方,你已经传递了一个字符串,其中需要模型类或实例。它试图调用_default_manager字符串,但显然失败了。

但是,由于错误出现在 Django 代码中,特别是在引用self.rel.to实例时,我只能假设您或您正在使用其代码的第三方已经对某些东西进行了一些非常完整和巨大的更改。这不是股票代码的行为方式。

于 2012-09-17T14:30:17.780 回答
6

通过查看以下链接,我的问题的解决方案似乎已得到解决:

在启动时获取“str”在 Django 应用程序上没有属性“_default_manager”

和:

Django Ticket 10405 评论 11

从技术上讲,Chris Pratt 的回答是绝对正确的,也是一个很好的解释,但在我的代码中,我找不到会导致此错误的实例。

该错误是随机发生的,但此错误的来源主要是由服务器监控系统为我的网站请求基本 url (/) 触发的(即完整的 HTTP 页面请求)。我只能假设监控系统使用类似 wget 命令的东西来进行检查,所以我使用这个命令来测试我网站的基本 url。

有时,此命令会返回 200 OK 响应,但在大多数情况下,这将返回 500 Internal Server Error 响应,即使我可以从浏览器正常访问该网站。似乎在重新启动 Apache 后总是会立即出现 500 Internal Server Error 响应。

对于这个错误的确切原因和随机性,我仍然有点困惑,我所看到的讨论指出了 Django 框架中可能存在的错误,但这在使用我在这里实现的相同设置的其他网站中不会发生. 阅读上面第二个链接中的评论,似乎使用了与我上面的问题类似的代码布局(仅在使用 Apache/mod_wsgi 的生产中发生,用于管理部分的 ModelForms,在模型中使用引用的 FK 引用)。

如上述链接中所述,解决方案是插入:

from django.db.models.loading import cache as model_cache
if not model_cache.loaded:
    model_cache.get_models() 

前:

admin.autodiscover()

在基本 urls.py 文件中。

希望这可以帮助其他可能偶然发现这个奇怪问题的人。自添加上述代码以来,我没有任何错误。

于 2012-09-20T14:54:52.407 回答
3

我遇到了这个错误消息,因为我没有在工厂的元类中正确指定模型

class FooBarFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = 'foobar'  # <-- must be 'myapp.foobar'
于 2017-05-25T10:42:09.917 回答
1

当我这样做时,我遇到了类似的错误:

from people.models import Quote

    quote = models.ManyToManyField(
            "Quote",
            blank=True,
            verbose_name=_("Quotes"),
            help_text=_("Select quotes"),
            default=None,
            related_name="people_quotes"
        )

但是当我删除引用模型“Quote”周围的引号时,错误就消失了。

from people.models import Quote

    quote = models.ManyToManyField(
            Quote,
            blank=True,
            verbose_name=_("Quotes"),
            help_text=_("Select quotes"),
            default=None,
            related_name="people_quotes"
        )
于 2016-07-24T01:53:25.940 回答
0
File "/home/lb/.local/lib/python3.6/site-packages/django/db/models/fields/related.py", line 1673, in formfield
    'queryset': self.remote_field.model._default_manager.using(using),
AttributeError: 'str' object has no attribute '_default_manager'

在我的模块中有一个错误的字符串代码:

错误:

tags = models.ManyToManyField('Tag', blank=True)

正确的:

tags = models.ManyToManyField(Tag, blank=True)

我还没有创建类标签

于 2021-12-29T17:33:04.030 回答