Администратор Django зависает (до ошибки тайм-аута) для конкретной модели при попытке редактирования / создания

#python #django #django-admin

#python #django #django-admin

Вопрос:

Это сводит меня с ума прямо сейчас. Раньше этого не происходило (даже есть скриншоты, которые я должен был сделать для руководства пользователя, поскольку этого требовал клиент).

Сначала я заметил это на производственном сервере, а затем проверил, и это также происходит на сервере разработки, который поставляется с Django. Модель появляется на главной странице администратора django, я могу щелкнуть по ней, и она отобразит список точек продаж. Проблема возникает всякий раз, когда я хочу отредактировать существующий экземпляр или создать новый.

Я просто нажимаю на ссылку (или помещаю ее на панель), и она просто зависает.

 class PointOfSaleAdmin(admin.ModelAdmin):
    list_display = ('id','business', 'user', 'zipcode', 'address','date_registered')
    list_filter = ('business',)
    filter_horizontal = ('services',)
admin.site.register(models.PointOfSale, PointOfSaleAdmin)
  

Это регистрация модели. Все модели зарегистрированы в приложении администратора, и пользователь, который проверяет это, является суперпользователем. Модель:

 class PointOfSale(models.Model):
    user = models.ForeignKey(User)
    zipcode = models.ForeignKey(Zipcode)
    business = models.ForeignKey(Business)
    services = models.ManyToManyField(Service, 
        verbose_name='available services')
    date_registered = models.DateField(auto_now_add=True)
    address = models.CharField(max_length=300)
  

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

Администратору очень, очень редко приходится обращаться к этой странице. Обычно это просто перечисление PoS, но это все еще беспокоит меня. Есть идеи о том, почему это могло зависнуть? Все остальные модели работают просто отлично.

Это происходит как в Django 1.2.5, так и в 1.3

Редактировать:

Я изменил ограничения тайм-аута. Это работает, но каким-то образом это занимает несколько минут, чтобы это действительно произошло. Итак, в фоновом режиме происходит что-то, что занимает целую вечность. Я не понимаю, почему это происходит только для этой модели, и это происходит в разных средах (и с небольшими наборами данных)


Мне почти хочется дать себе пощечину. Моя вина в том, что я так долго не спал.

Проблема в том, что список zip-кодов довольно большой (десятки тысяч), а поле внешнего ключа загружается как html-тег select, что означает, что он загружает каждую отдельную запись. Это проблема с тем, сколько данных там просто.

Теперь мне интересно, как контролировать способ отображения внешнего ключа в admin. Кто-нибудь может помочь с этим?

Комментарии:

1. Интересный вопрос с интересным ответом. Я был виновен в этом в течение последнего месяца — протестируйте свое приложение с большими наборами данных, потому что отслеживание подобных проблем неочевидно, когда вы считаете, что протестировали все.

Ответ №1:

В вашем admin.py файл в соответствующем классе admin, установленный

 raw_id_fields = ('zipcode',)
  

Это отобразит PK почтового индекса вместо выпадающего списка.

Есть ли причина, по которой вы настраиваете zipcode как свою собственную модель вместо использования CharField или фактического zipcode modelfield?

Комментарии:

1. Честно говоря, я никогда их не использовал. Хотя причина, по которой я использую zipcode в качестве модели, заключается в том, что у меня есть все координаты (долготы и широты), и я использую его для отображения (в GMap), где точки продаж расположены по всей территории США. Спасибо!

2. Достаточно справедливо. Просто хотел убедиться, что лучшего решения не было.

3. Кстати, в конечном итоге я использовал что-то из django_extension, которое обеспечивает автозаполнение для администратора. Ужасная документация, и она делала не совсем то, что я хотел, но я изменил большую часть кода и заставил его вести себя правильно.

4. У меня была похожая проблема, и это сработало для меня. Я просто хотел бы, чтобы Django был достаточно умен, чтобы не пытаться отобразить выпадающий список с более чем 100 000 элементами…

Ответ №2:

Я просто хотел добавить, что другим вариантом здесь является создание read_only_fields списка. В случаях, когда существует связь с моделью с большим количеством вариантов (в моем случае каталогизация таблицы rel указывает на большое количество пользователей и тем обсуждения), но вам не нужно редактировать поле. Вы можете добавить его в read_only_fields список, который просто выведет значение, а не варианты.

 class FlaggedCommentsAdmin(ModelAdmin):
    list_display = ('user', 'discussion', 'flagged_on')
    readonly_fields = ('user', 'discussion')
  

Ответ №3:

Для людей, которые все еще заходят на эту страницу: Как указывает Мамсаак в своем первоначальном сообщении, тайм-аут возникает из-за того, что django пытается загрузить все экземпляры ForeignKey в html-select. Django 2 позволяет добавить поле автозаполнения, которое асинхронно позволяет вам искать ForeignKey , чтобы справиться с этим. В вашем admin.py сделайте что-то вроде этого:

 from django.contrib import admin
from .models import Parent, Child

@admin.register(Parent)
class ParentAdmin(admin.ModelAdmin):
    # tell admin to autocomplete-select the "Parent"-field 'children'
    autocomplete_fields = ['children']

@admin.register(Child)
class ChildAdmin(admin.ModelAdmin):
    # when using an autocomplete to find a child, search in the field 'name'
    search_fields = ['name']      
  

Комментарии:

1. autocomplete_fields = [‘children’] мне помогло

Ответ №4:

Вы пробовали проверять журналы apache (если вы, очевидно, используете apache) или любые другие журналы, связанные с HTTP-сервером? Это может дать вам представление о том, с чего начать.

Это единственная модель, которая затронута? Вы упомянули методы в модели. Попробуйте закомментировать эти методы и повторить попытку (включая __unicode__ метод), просто чтобы посмотреть, влияют ли они как-то на это. Сократите все до минимума (очевидно, насколько это возможно), чтобы попытаться определить, с чего началась регрессия.

Попробуйте отслеживать ресурсы сервера при запросе этой страницы. Происходит ли резкий скачок процессора? Как насчет сетевого ввода-вывода? Может быть проблема с базой данных (каким-то образом?).

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

Комментарии:

1. Я проверил журналы. Я использую Apache / WSGI. Ошибок нет, за исключением некоторых предупреждений об устаревании (но они исходят от Django, и я проверил, что это не связано с этой проблемой). Я взял ВСЕ атрибуты администратора во всех моделях (обратите внимание, это в admin.py файл) и повторил попытку без успеха. Итак, я рассматриваю, что это может быть в models.py , но я не нашел ничего подозрительного : ( Никаких скачков процессора, я проверил. Я думаю, что это должно быть какой-то проблемой с БД, действительно: S И большое спасибо! Я проверю больше в БД

2. Я не помню, чтобы я это делал, но если бы я изменил модели, не изменяя структуру таблицы вручную, могло ли это быть причиной?