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