4

我正在开发一个在线表单生成器工具(专门用于保险代理人)。我们希望为客户提供的一件事是默认情况下可以使用常见产品(汽车、家庭、生活等)的预构建表单,但仍然可以修改。

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

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

4

3 回答 3

2

在 sebpiq 的帮助下,我能够使用Southnatural keysjson 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()  
于 2011-05-11T18:43:50.247 回答
0

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

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

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

  • 另一个解决方案是手动做这些事情:

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

希望能帮助到你 !

于 2011-05-09T20:22:44.017 回答
-2

如果 pk 键有null一个夹具中的值,loaddata 将在数据库表中创建一个新行(从主键序列中分配一个新的主键值)。可以这么简单。

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

于 2012-10-16T19:45:56.787 回答