Django AttributeError:'str'对象没有属性'_default_manager'

时间:2012-09-17 11:31:45

标签: django circular-reference attributeerror

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

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

我已经在SO和谷歌上看到了各种答案,但似乎没有任何明确的理由说明为什么会出现这种错误。也许这是因为错误是相当通用的,但最常见的答案似乎是由于循环导入错误。我看到的另一个答案是模型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的svn位置== 2.0.0b1-dev-20111019
  • 警告:找不到分发的svn位置== 0.6.24dev-r0
  • 的Django == 1.3.3
  • GnuPGInterface == 0.3.2
  • 横向 - 客户端== 12.05
  • PAM == 0.4.2
  • PIL == 1.1.7
  • 扭绞芯== 11.1.0
  • 易于-Xapian的折射率== 0.44
  • argparse == 1.2.1
  • chardet的== 2.0.1
  • 命令未找到== 0.2.44
  • ## FIXME:在此程序包的dependency_links中找不到svn URL:distribute == 0.6.24dev-r0
  • Django的调试工具栏== 0.9.4
  • 的django-罗塞塔== 0.6.8
  • httplib2的== 0.7.2
  • iotop == 0.4.4
  • 钥匙圈== 0.7.1
  • 语言选择器== 0.1
  • launchpadlib == 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:在此程序包的dependency_links中找不到svn URL:pymssql == 2.0.0b1-dev-20111019
  • pyserial == 2.5
  • 蟒-易于== 0.8.3ubuntu7
  • 蟒-的Debian == 0.1.21ubuntu1
  • ==的ReportLab 2.5
  • simplejson == 2.3.2
  • UFW == 0.31.1-1
  • wadllib == 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 个答案:

答案 0 :(得分:19)

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

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

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

答案 1 :(得分:4)

_default_manager是模型上的属性,它包含该模型的(惊讶,惊讶)默认管理器。 Django在整个地方使用它,特别是在管理员中,返回ModelAdmins的查询集。

因此,错误告诉您某处,您已经传递了一个字符串,其中包含模型类或实例。它试图在字符串上调用_default_manager,但显然失败了。

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

答案 2 :(得分:0)

我遇到类似的错误:

from people.models import Quote

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

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

from people.models import Quote

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

答案 3 :(得分:0)

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

"CODE0001"  "Name1  "   14.46   0.05
"CODE0002"  "Name2" 17.37   0.05    
"CODE0003"  "Name3" 22.66   0.05