次のエラーは、ライブサーバー(つまり、apache mod_wsgiを介して)でランダムに発生するようですが、開発中(つまり、localhost python manage.py runserver)では発生しません。
これはまれにしか発生せず、簡単に、または特定のURLにアクセスするたびに再現できるものではないことに注意してください。
ここSOとグーグルの両方にさまざまな回答が投稿されているのを見てきましたが、このエラーが発生する明確な理由はないようです。おそらくこれは、エラーがかなり一般的であるためですが、最も一般的な答えは循環インポートエラーが原因であると思われます。私が見たもう1つの答えは、モデルFKフィールド参照が正しいケースではなかったということです(たとえば、applabel.Modelではなくapplabel.model)が、すべてのモデルFKフィールドは正しいです。
エラーの原因は、私のadmin.pyファイルの1つを指しているようです。このファイルは元々、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の場所が見つかりません
- 警告:distribute==0.6.24dev-r0のsvnの場所が見つかりません
- Django == 1.3.3
- GnuPGInterface == 0.3.2
- ランドスケープ-クライアント==12.05
- PAM == 0.4.2
- PIL == 1.1.7
- Twisted-Core == 11.1.0
- apt-xapian-index == 0.44
- argparse == 1.2.1
- chardet == 2.0.1
- command-not-found == 0.2.44
- ## FIXME:このパッケージのdependency_linksで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
- language-selector == 0.1
- launchpadlib == 1.9.12
- lazr.restfulclient == 0.12.0
- lazr.uri == 1.0.3
- Mercurial == 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
- python-apt == 0.8.3ubuntu7
- python-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