从数据装置更新数据库记录

eug*_*ene 5 django django-fixtures

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

\n

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

\n

\xe2\x80\x9cinsert 或从序列化 data\xe2\x80\x9d 操作更新应该是幂等的

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

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

\n

如何使用现有的 Django \xe2\x80\x9cload data\xe2\x80\x9d 功能(无论是loaddataDjango 中的其他功能)来读取序列化数据,如果记录不存在则插入记录,如果记录存在则更新记录已经存在

\n

Ste*_*lim 4

是的,您可以使用loaddata

python3 -m django loaddata path/to/fixture/some_new_data.json
Run Code Online (Sandbox Code Playgroud)

但:

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

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