【问题标题】:Import data into Django model with existing data?使用现有数据将数据导入 Django 模型?
【发布时间】:2011-08-21 20:51:47
【问题描述】:

我正在开发一个在线表单构建工具(专门针对保险代理人)。我们希望为客户提供的其中一件事是让常见产品(汽车、家居、生活等)的预构建表单默认可用,但仍可修改。

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

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

【问题讨论】:

  • 你不能用dumpdata, loaddata 做吗?
  • 如果任何主键与我的客户创建的现有表单/字段一致,则不会。他们做的。
  • 我不完全确定,但我认为如果你使用自然键,你不需要主键来加载数据!?
  • 你能举个例子吗?一些文件?也许以答案的形式? =-]

标签: django django-models django-fixtures


【解决方案1】:

在 sebpiq 的帮助下,我能够使用 Southnatural keysjson dumpdata 修复此问题。

基本上它只是一个使用转储 json 的data migration

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()  

【讨论】:

    【解决方案2】:

    这里有 3 个你可以挖掘的想法(对不起,我没有时间给出更好的答案:-S)

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

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

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

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

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-02-10
        • 1970-01-01
        • 2014-08-30
        • 2021-01-14
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 2019-01-31
        • 2014-09-30
        相关资源
        最近更新 更多