使用现有数据将数据导入Django模型?

时间:2011-05-09 17:20:49

标签: django django-models django-fixtures

我正在开发一个在线表单构建工具(专门针对保险代理商)。我们希望为客户提供的一件事就是为普通产品(汽车,家庭,生活等)提供预先构建的表格,默认情况下可用,但仍可修改。

在正常情况下,我只需在开发环境中创建表单,然后创建包含这些表单的fixture,并在所有实时站点上运行syncdb。不幸的是,这是不可能的,因为我们的一些客户已经创建了表单,这可能与我的夹具中的主键冲突。我还希望导出四个不同的相互关联的表格,但它们都在我的sqformbuilder应用程序中。

有没有办法导出灯具但是允许它灵活地插入数据库的另一个运行副本?

3 个答案:

答案 0 :(得分:2)

在sebpiq的帮助下,我可以使用Southnatural keysjson dumpdata来解决此问题。

基本上它只是data migration使用转储的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()  

答案 1 :(得分:0)

以下是您可以挖掘的3个想法(抱歉,我没有时间给出更好的答案:-S)

  • 这可能是South的用例,谁知道?

  • 查看有关序列化,反序列化和自然键的章节:http://docs.djangoproject.com/en/dev/topics/serialization/#deserialization-of-natural-keys ...我知道它适用于外键,我没有尝试使用主键

  • 另一种解决方案是手动完成任务:

    • 使用manage.py
    • 转储您的数据
    • 将其复制到要加载它的服务器上
    • 打开./manage.py shell并使用反序列化器手动加载此数据,对于每个反序列化的对象,在保存之前将pk设置为None(因此将自动分配新的pk)。

希望它有所帮助!

答案 2 :(得分:-1)

如果pk键在fixture中具有值null,则loaddata将在数据库表中创建一个新行(从主键序列中分配新的主键值)。这可能很容易。

唯一的复杂因素是模型是否有外键。在这种情况下,根据https://docs.djangoproject.com/en/dev/topics/serialization/#deserialization-of-natural-keys,必须使用自然键将引用的外键表配置为反序列化。在您的fixture中,您将使用外部自然键,而不是使用外部主键值。例如,{"widget": 42}可能改为{"widget": ["XJ234245"]}。另请参阅serialization using natural keys部分,这有助于使用自然键转储灯具。