2012-09-17 152 views
3

以下錯誤似乎隨機發生在我的現場服務器上(即通過Apache mod_wsgi),但從未在開發中(即localhost python manage.py runserver)。Django AttributeError:'str'對象沒有屬性'_default_manager'

請注意,這種情況很少發生,並且不是每次訪問特定網址都可輕鬆複製的內容。

我已經看到在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' 

包和

版本
  • 警告:找不到svn的位置pymssql == 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:找不到svn的URL在dependency_links這個包:分配= = 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
  • 我rcurial == 2.0。2
  • OAuth的== 1.0.1
  • psycopg2 == 2.4.5
  • pyOpenSSL == 0.12
  • pycrypto == 2.4.1
  • ## FIXME:無法找到dependency_links SVN的網址這個包: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 
+0

你可以寫的版本是您使用的軟件包指定模型? '點 - 凍結'可以做到這一點,請寫我數據庫引擎和版本。 'settings.py'的內容也很好。 CardAdmin和CardAdminForm類的定義也需要 – WBAR

+0

我想我已經編輯過,包括所有你需要的東西。你需要什麼settings.py細節?謝謝。 – chewynougat

+0

「/myproject/myapps/app/admin.py」,第61行指向..? – WBAR

回答

6

我的問題的解決方案似乎已經通過查看以下鏈接解決:

Getting the 「str」 has no property 「_default_manager」 on a Django app just on startup

和:

Django Ticket 10405 Comment 11

技術上克里斯·普拉特的答案是絕對正確的,一非常好的解釋,但在我的代碼無處可以找到一個會導致此錯誤的實例。

該錯誤是隨機發生的,但此錯誤的來源主要是由服務器監控系統爲我的網站請求基本網址(/)(即完整的HTTP頁面請求)觸發的。我只能假定監控系統使用類似wget命令的方式進行此檢查,因此我使用此命令來測試我的網站的基本網址。

有時這個命令會返回200 OK響應,但在大多數情況下,這將返回500內部服務器錯誤響應,即使我可以從瀏覽器訪問網站。似乎也有一個500內部服務器錯誤響應總是重新啓動Apache後立即發生。

對於這個錯誤的確切原因和隨機性,我仍然有點困惑,我所看到的討論指出了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文件

希望這有助於其他人可能偶然發現這個奇怪的問題。自從完成上面的代碼以來,我一直沒有錯誤。

4

_default_manager是模型的屬性,該模型包含該模型的(驚喜,驚喜)默認管理器。 Django在整個地方使用它,尤其是在管理員中,爲ModelAdmins返回查詢集。

所以這個錯誤告訴你,在某個地方,你已經傳遞了一個字符串,其中應該有一個模型類或實例。它試圖在字符串上調用_default_manager,並且顯然失敗。

但是,由於錯誤出現在Django代碼中,尤其是在實例上引用self.rel.to時,我只能假設您或您正在使用的代碼的第三方已對某些內容進行了一些非常不可或缺的修改。這不是股票代碼應該如何表現的方式。

12

快速注意仍然會發現這個老問題的人:這種情況也可能是由於使用字符串作爲無效的引用的ForeignKey/ManyToMany/OnetoOne引起的(例如:未正確指向模型)。

我正在更新/重構一個項目,並遇到了這個問題。原來這只是一個錯字。

有點奇怪的django沒有明確地通知它不能解決字符串,可能是因爲其他應用程序混淆它。

+2

碰到一樣:) – Babu

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" 
     ) 
0

我跑在此錯誤消息,因爲我沒有正確的元類工廠

class FooBarFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = 'foobar' # <-- must be 'myapp.foobar' 
相關問題