4

如何使用数据夹具(或其他序列化记录)中的记录更新已填充的 Django 数据库?

我知道我可以使用 Django数据夹具来提供初始数据。我可以使用相同的已编写功能从数据夹具(或类似的序列化数据,如 JSON 文档)更新数据库吗?

“从序列化数据插入或更新”操作应该是幂等的:

  • 如果数据库中不存在记录(通过其键),则应将其插入。
  • 如果数据库中已经存在一条记录(通过它的键),则应该更新它以匹配数据夹具。
  • 最终状态应该是数据夹具中的所有数据都应该在数据库中更新,无论记录是否已经存在。

具体来说,我可以通过指定pk=null和使用自然键来更新现有行吗?

我如何使用现有的 Django “加载数据”功能(无论loaddata是 Django 中的其他类似功能)来读取序列化数据,如果它们不存在则插入记录,如果它们已经存在则更新它们

4

1 回答 1

4

是的,您可以使用loaddata

python3 -m django loaddata path/to/fixture/some_new_data.json

但:

  • 不要调用您的新数据initial_data.json,否则每次您同步数据库或运行 South migraton 时都会重新加载它,并且会清除自加载夹具以来所做的任何更改。(如本页中途所述)
  • 与上述相关,除非您确定在编写夹具时新数据不会到达,否则通过夹具加载数据可能是一种脆弱的方式。如果是这样,您将面临冲突以及数据库中出现故障或“不正确”数据的风险。

根据数据的性质,在 South 中使用数据迁移可能会更好。当您为大量记录设置几个值时(例如,更改字段的默认值,或用数据填充空白字段),数据迁移可能会很好。数据迁移还允许您通过 Python 对事物应用一些检查/逻辑,以便您可以针对要更新的记录,或以不同的方式更新不同的记录,而不是编写大量的固定装置。但是,如果您想加载大量新记录,那么固定装置会更有意义。

于 2013-06-12T10:34:48.003 回答