В большинстве случаев вы можете найти естественную иерархию ваших объектов. Иногда существует какой-то «мастер», и все другие объекты имеют ссылки внешнего ключа (FK) на этот мастер и друг на друга.
В этом случае вы можете использовать XML-подобную структуру с каждым главным объектом, «содержащим» множество вспомогательных объектов. В этом случае вы сначала вставляете мастер, и все дочерние элементы имеют ссылки FK на существующий объект.
В некоторых случаях, однако, существуют отношения, которые не могут быть простыми FK для существующего объекта. В этом случае у вас есть циклические зависимости, и вы должны (1) временно отключить эту зависимость и (2) воссоздать зависимость после загрузки объектов.
Вы делаете это путем (a) определения вашей модели для необязательного FK, (b) и наличия временной ссылки «естественного ключа». Вы будете загружать данные без правильного FK (это необязательно).
Затем, после загрузки ваших данных, вы возвращаетесь ко второму проходу и вставляете все недостающие ссылки FK. После этого вы можете изменить свою модель, чтобы сделать обязательным FK.
Программа 1 - экспорт из старой базы данных в простой плоский файл. Формат CSV или JSON или что-то простое.
for m in OldModel.objects.all():
aDict = { 'col1':m.col1, 'old_at_fk':m.fktoanothertable.id, 'old_id':id }
csvwriter.writerow( aDict )
Программа 2 - чтение простого плоского файла; построить новые объекты модели базы данных.
# Pass 1 - raw load
for row in csv.reader:
new= NewModel.create( **row )
# Pass 2 - resolve FK's
for nm in NewModel.objects.all():
ref1= OtherModel.objects.get( old_id=nm.old_at_fk )
nm.properfk = ref1
nm.save()