Django импортирует базу данных - я делаю это неправильно? Может быть, Django не подходит для этой цели?
Так что, возможно, я что-то упускаю в концептуальном плане или просто делаю это неправильно. Или, в худшем случае, «Django не для этого» :-/
Я настроил свой экземпляр Django так, чтобы полностью использовать преимущества внешней базы данных, которая содержит, среди прочего, все мои данные iTunes (нет, не Music), с обширным журналом изменений. Это не относится к моему вопросу, но я хотел выложить это, чтобы показать, что я не полный новичок (я даже настроил это так, чтобы Django не возился с внешней базой данных, доступной только для чтения, что является некоторым достижением).
Я пытаюсь импортировать это в модели Django в моей реальной базе данных Django, чтобы использовать преимущества администрирования Django, готовясь к созданию веб-приложения вокруг всего этого.
Я настроил модели Django и создал несколько процедур (SQLAlchemy) для ETL моих данных в три таблицы (Songs, Artists, Albums). У меня много данных (783122 песни из 59445 альбомов 97562 исполнителей), но это не должно перегружать такой надежный фреймворк, как Django, я бы не думал.
Итак, данные импортированы & я настроил базовую админку, которая должна просто показывать песни в строке, когда я перехожу на страницу администратора для исполнителя или альбома. Попытки сделать это не вызывают ошибок, но приводят к бесконечному вращению & без доступа к странице альбома или исполнителя.
Изначально я подумал, что все эти натуральные клавиши, которые я использую, наконец-то укусили меня за задницу, поэтому я перепрыгнул через кучу обручей, чтобы перевести каждую натуральную клавишу в простой bigint.
Это не помогло. Я наблюдаю за вращением колеса спустя 30 минут, пока печатаю текст.
Одна мысль, которая у меня возникла: ну, поскольку только что был импортирован огромный объем данных, индексирование всех этих PK может занять некоторое время. Я полагаю, что это возможно, и я слежу за этим, но уже сейчас это кажется чрезмерным количеством времени для установки, в которой самая большая таблица составляет <1M строк.
Есть какие-нибудь мысли? Было бы интересно услышать от людей, которые имеют некоторый опыт в этой области, прежде чем я просто выброшу свой код. Может, мне просто попробовать Flask? Я в некоторой растерянности, как начать отладку этой проблемы.
Это известная проблема в Django. Если вы хотите отредактировать детали ItunesAlbum
, то таким образом будут получены все связанные ItunesSong
, что делается с помощью одного запроса. Так что на первый взгляд это не выглядит очень проблематично.
Но эти модели имеют ForeignKey
, а ForeignKey
по умолчанию разрешается ModelChoiceField
формой поля [Django-doc]. Таким образом, это подразумевает, что будет получено всех моделей связанного поля, потому что если вы откроете выпадающий список, он, таким образом, должен будет перечислить все варианты.
Это означает, что для каждого внешнего ключа и для каждого встроенного объекта выполняется запрос. Таким образом, для альбома с 10 песнями он, по крайней мере, трижды выполнит поиск всех исполнителей. Что, конечно, порождает много запросов.
Хорошая новость заключается в том, что мы можем смягчить эту проблему. Предварительно выбрав ForeignKey
для встроенной модели, а также используя поле автозаполнения, которое предотвращает выборку всех художников, так что:
class AlbumArtistSongInline(admin.TabularInline):
model = ItunesSong
autocomplete_fields = ['artistid', 'expressedartistid', 'albumartistid']
def get_queryset(self, *args, **kwargs):
return (
super()
.get_queryset(*args, **kwargs)
.select_related('artistid', 'expressedartistid', 'albumartistid')
)