6

次のエラーは、ライブサーバー(つまり、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
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

私の問題の解決策は、次のリンクを見ると解決されたようです。

起動直後のDjangoアプリで「str」を取得してもプロパティ「_default_manager」はありません

と:

Djangoチケット10405コメント11

技術的には、Chris Prattの答えは完全に正しく、非常に良い説明ですが、私のコードのどこにも、このエラーの原因となるインスタンスを見つけることができませんでした。

エラーはランダムに発生しましたが、このエラーの原因は主に、サーバー監視システムが私のWebサイトのベースURL(/)を要求することによって引き起こされていました(つまり、完全なHTTPページ要求)。監視システムがwgetコマンドのようなものを使用してこのチェックを行うと想定できるので、このコマンドを使用してWebサイトのベースURLをテストしました。

時折、このコマンドは200 OK応答を返しますが、ほとんどの場合、ブラウザーからWebサイトに正常にアクセスできたとしても、これは500内部サーバーエラー応答を返します。また、 Apacheを再起動した直後に500 InternalServerError応答が常に発生するようです。

このエラーの正確な原因とランダム性についてはまだ少し戸惑っています。これまでに見た議論では、Djangoフレームワークのバグの可能性が指摘されていますが、ここで実装したのと同じセットアップを使用している他のWebサイトでは発生しません。 。上記の2番目のリンクのコメントを読むと、上記の質問と同様のコードレイアウトが使用されているようです(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 に答える