Импортировать данные в модель Django с существующими данными? - PullRequest
4 голосов
/ 09 мая 2011

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

В нормальных условиях я просто создал бы формы в своей среде разработки, затем создал прибор, содержащий эти формы, и запустил syncdb на всех живых сайтах. К сожалению, это невозможно, так как некоторые из наших клиентов уже создали формы, которые могут конфликтовать с первичными ключами в моем приборе. Есть также четыре разные взаимосвязанные таблицы, которые я хочу экспортировать, но все это в моем приложении sqformbuilder.

Есть ли способ экспортировать прибор, но можно гибко вставить его в другую работающую копию базы данных?

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

С некоторой помощью sebpiq я смог исправить это, используя Юг , естественные ключи и json dumpdata .

По сути, это просто миграция данных с использованием дампованного json:

datafdir = os.path.dirname(__file__)
dataf = open(os.path.join(datafdir, '0002_mh_quote_form.data.json'), 'r')
builtformfieldsjson = simplejson.loads(dataf.read())
form = BuiltForm.objects.get(pk=1)
for field in builtformfieldsjson:
    try:
        builtfield = BuiltFormField.objects.get_by_natural_key(form, field['fields']['fieldname'])
    except:
        builtfield = BuiltFormField(fieldname=field['fields']['fieldname'], builtform=form)
    for part in field['fields']:            
        if part == 'builtform':
            continue
        setattr(builtfield, part, field['fields'][part])
    builtfield.save()  
0 голосов
/ 16 октября 2012

Если ключ pk имеет значение null в приборе, loaddata создаст новую строку в таблице базы данных (выделив новое значение первичного ключа из последовательности первичного ключа).Это может быть так просто.

Единственное осложнение, если модель имеет внешние ключи.В этом случае ссылочные таблицы внешнего ключа должны быть сконфигурированы для десериализации с использованием естественных ключей согласно https://docs.djangoproject.com/en/dev/topics/serialization/#deserialization-of-natural-keys. В вашем приборе вместо использования значений внешнего первичного ключа вы будете использовать внешние естественные ключи.Например, {"widget": 42} может быть вместо {"widget": ["XJ234245"]}.См. Также раздел о сериализации с использованием естественных ключей , что полезно при сбрасывании приборов с естественными ключами.

0 голосов
/ 10 мая 2011

Вот 3 идеи, которые вы можете выкопать (извините, у меня нет времени, чтобы дать лучший ответ: -S)

  • Это может быть сценарий использования для Юг , кто знает?

  • Ознакомьтесь с главой по сериализации, десериализации и естественным ключам: http://docs.djangoproject.com/en/dev/topics/serialization/#deserialization-of-natural-keys ... Я знаю, что это работает для внешних ключей,Я не пробовал с первичными ключами

  • Другое решение состоит в том, чтобы сделать вещи вручную:

    • сбросить ваши данные с manage.py
    • скопируйте его на сервер, на который вы хотите его загрузить
    • откройте ./manage.py shell и загрузите эти данные вручную десериализаторами, для каждого десериализованного объекта установите pk в None перед его сохранением (поэтому новый pk будетавтоматически назначается).

Надеюсь, это поможет!

...