2011-05-09 68 views
4

我正在开发一个在线表单生成器工具(专门用于保险代理)。我们希望为我们的客户提供的一件事是,默认情况下可以提供普通产品(汽车,家庭,生活等)的预制表格,但仍然可以修改。将数据导入带有现有数据的Django模型?

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

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

+0

你不能用'dumpdata','loaddata'来做吗? – sebpiq 2011-05-09 18:06:16

+0

如果任何主键与我的客户创建的现有表单/字段一致,则不会。他们做什么。 – 2011-05-09 18:27:02

+0

我不完全确定,但我认为如果您使用自然键,则不需要主键就可以加载数据! – sebpiq 2011-05-09 18:46:04

回答

2

在sebpiq的帮助下,我可以使用South,natural 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() 
0

这里有3个想法,你可以挖(抱歉,我没有时间给一个更好的答案:-S)

  • 这可能是一个用例为South,谁知道?

  • 退房的序列化,反序列化和自然键章:http://docs.djangoproject.com/en/dev/topics/serialization/#deserialization-of-natural-keys ...我知道它的工作原理为外键,我还没有和主键

  • 另一种解决方案是做的事情尝试手动:

    • 与manage.py转储数据
    • 复制到服务器上要加载它
    • 开放./manage.py shell和加载这个数据手动机智h解串器,对于每个反序列化的对象,在保存之前将pk设置为None(所以新的pk将被自动分配)。

希望它有帮助!

-1

如果PK的关键在一个固定值null,loaddata将在数据库中创建表中的新行(分配一个新的主键来自主键序列的值)。它可以是这么简单。

唯一的问题是如果模型有外键。在这种情况下,必须将引用的外键表配置为使用自然键进行反序列化,如https://docs.djangoproject.com/en/dev/topics/serialization/#deserialization-of-natural-keys所示。在你的夹具中,不要使用外键的主键值,而是使用外键的自然键。例如,{"widget": 42}可能改为{"widget": ["XJ234245"]}。另请参阅serialization using natural keys上的章节,该章节有助于使用自然钥匙倾倒固定装置。

相关问题