Django AttributeError: объект «str» не имеет атрибута «_default_manager»

Следующая ошибка, по-видимому, возникает случайным образом на моем рабочем сервере (т. Е. Через apache mod_wsgi), но никогда не в процессе разработки (т. Е. Localhost python manage.py runserver).

Обратите внимание, что это происходит нечасто, и это не то, что можно легко воспроизвести или каждый раз при доступе к определенному URL-адресу.

Я видел различные ответы, размещенные как здесь, в 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 для Distribute==0.6.24dev-r0.
  • Джанго == 1.3.3
  • GnuPGInterface==0.3.2
  • Пейзаж-клиент == 12.05
  • ПАМ==0,4,2
  • ПИЛ==1.1.7
  • Витое ядро ​​== 11.1.0
  • apt-xapian-индекс == 0,44
  • разбор == 1.2.1
  • карта == 2.0.1
  • команда не найдена == 0.2.44
  • ## ИСПРАВЛЕНИЕ: не удалось найти URL-адрес svn в dependency_links для этого пакета: Distribute==0.6.24dev-r0
  • панель инструментов django-debug == 0.9.4
  • джанго-розетта==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
  • оаут == 1.0.1
  • psycopg2==2.4.5
  • pyOpenSSL == 0,12
  • крипто == 2.4.1
  • ## ИСПРАВЛЕНИЕ: не удалось найти URL-адрес svn в dependency_links для этого пакета: pymssql==2.0.0b1-dev-20111019
  • pyserial==2.5
  • Python-apt == 0.8.3ubuntu7
  • python-debian==0.1.21ubuntu1
  • отчетлаб==2.5
  • простой json == 2.3.2
  • ufw==0.31.1-1
  • вадлиб==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

person chewynougat    schedule 17.09.2012    source источник
comment
Можете ли вы написать версии пакетов, которые вы используете? 'pip --freeze' может это сделать, и, пожалуйста, напишите мне механизм базы данных и версию. Содержимое 'settings.py' также было бы неплохо. Также необходимо определить классы CardAdmin и CardAdminForm.   -  person WBAR    schedule 17.09.2012
comment
Я думаю, что отредактировал, чтобы включить все, что вам нужно. Какая деталь settings.py вам нужна? Спасибо.   -  person chewynougat    schedule 17.09.2012
comment
/myproject/myapps/app/admin.py, строка 61 указывает на .. ?   -  person WBAR    schedule 17.09.2012


Ответы (5)


Краткое примечание для тех, кто все еще находит эту старую проблему: этот случай также может быть вызван ForeignKey/ManyToMany/OnetoOne, который использует строку в качестве ссылки, которая недействительна (например, неправильное указание на модель).

Я обновлял/рефакторинг проекта и столкнулся с этим. Оказалось, это просто опечатка.

Довольно странно, что django не уведомляет четко, что не может разрешить строку, возможно, потому, что другие приложения спутали ее.

person Bartvds    schedule 08.01.2016
comment
Наткнулся на такое же :) - person Babu; 18.01.2016
comment
Спасибо! Просто переместил свои модели в другой пакет (приложение) и забыл изменить параметр to=. - person Niakros; 27.08.2018

_default_manager — это атрибут модели, который содержит (сюрприз, сюрприз) менеджер по умолчанию для этой модели. Django использует это повсеместно, особенно в админке, чтобы возвращать наборы запросов для ModelAdmins.

Таким образом, ошибка сообщает вам, что где-то вы передали строку, в которой ожидался класс или экземпляр модели. Он пытается вызвать _default_manager для строки и, очевидно, терпит неудачу.

Однако, поскольку ошибка возникает в коде Django, в частности, при ссылке на self.rel.to в экземпляре, я могу только предположить, что вы или какая-то третья сторона, чей код вы используете, внесли в что-то довольно существенные и монументальные изменения. Это не то, как должен вести себя стоковый код.

person Chris Pratt    schedule 17.09.2012

Решение моей проблемы, кажется, было решено, просмотрев следующие ссылки:

Получение «str» не имеет свойства «_default_manager» в приложении Django только при запуске

и:

Django Ticket 10405 Comment 11

Технически ответ Криса Пратта абсолютно правильный и очень хорошее объяснение, но нигде в моем коде я не смог найти экземпляр, который вызывал бы эту ошибку.

Ошибка возникла случайным образом, но источник этой ошибки в основном был вызван системой мониторинга сервера, запрашивающей базовый URL-адрес (/) для моего веб-сайта (т. е. полный запрос HTTP-страницы). Я могу только предположить, что система мониторинга использует что-то вроде команды wget для этой проверки, поэтому я использовал эту команду для проверки базового URL-адреса моего веб-сайта.

Иногда эта команда возвращала ответ 200 OK, но в большинстве случаев она возвращала ответ 500 Internal Server Error, хотя я мог нормально получить доступ к веб-сайту из браузера. Также кажется, что ответ 500 Internal Server Error всегда будет появляться сразу после перезапуска Apache.

Я все еще немного озадачен точной причиной и случайностью этой ошибки, обсуждения, которые я видел, указывают на возможную ошибку в среде Django, но этого не происходит на других веб-сайтах, использующих ту же настройку, которую я реализовал здесь. . Читая комментарии во 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.

Надеюсь, это поможет другим, которые могут наткнуться на эту странную проблему. У меня не было ошибок с момента добавления вышеуказанного кода.

person chewynougat    schedule 20.09.2012

Я столкнулся с этим сообщением об ошибке, потому что неправильно указал модель в метаклассе фабрики.

class FooBarFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = 'foobar'  # <-- must be 'myapp.foobar'
person ezdazuzena    schedule 25.05.2017

Я получил аналогичную ошибку, когда я сделал:

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"
        )
person Frux    schedule 24.07.2016