Django:loaddata更新数据

Ell*_*one 9 python django fixtures loaddata

我有一个夹具seed_data.json,我有我的初始数据.

有时我会在这个灯具中添加新数据并重新加载,这会正确地更新我的数据.

但是,我现在想从中删除一些数据.所以我修改了我的seed_data.json,例如,我有类似的东西:

{"fields": {"name": "Field 0"},"model": "catalog.product","pk": 1},
{"fields": {"name": "Field 1"},"model": "catalog.product","pk": 2},
{"fields": {"name": "Field 2"},"model": "catalog.product","pk": 3},
# ...
Run Code Online (Sandbox Code Playgroud)

那成了:

{"fields": {"name": "Field 1"},"model": "catalog.product","pk": 1},
{"fields": {"name": "Field 2"},"model": "catalog.product","pk": 2},
# ...
Run Code Online (Sandbox Code Playgroud)

但是我得到了:

django.db.utils.IntegrityError: Problem installing fixture .....\seed_data.json

Could not load catalog.Product(pk=2): column name is not unique

因此在添加一些数据时没有问题,但在尝试删除某些数据时,与主键存在冲突.

我怎样才能实现我想做的事情?

G. *_*eau 8

这么多年过去了,带着一个未解决的问题来到这里,让我想补充一些东西,因为我也确实在赛程方面遇到了困难。

对于修改现有数据,正如 @Thomas 所说,最好使用Django 数据迁移

不过,当刚接触 Django 时,您可能会想使用固定装置来更新一些基本数据。再次强调,不建议这样做,但解释一下可以做什么也没什么坏处。因此,使用示例:

{"fields": {"name": "Field 0"},"model": "catalog.product","pk": 1},
{"fields": {"name": "Field 1"},"model": "catalog.product","pk": 2},
{"fields": {"name": "Field 2"},"model": "catalog.product","pk": 3},
# ...
Run Code Online (Sandbox Code Playgroud)

那变成了:

{"fields": {"name": "Field 1"},"model": "catalog.product","pk": 1},
{"fields": {"name": "Field 2"},"model": "catalog.product","pk": 2},
# ...
Run Code Online (Sandbox Code Playgroud)

这里,问题确实是尝试使用另一个对象(具有 的对象pk = 3)上已存在的主键来更新对象。pk = 3您无法仅使用夹具删除对象。如果您手动执行此操作,那么上面更新的固定装置就可以工作。

以下是一些可以提供帮助的规则。

修改夹具并调用loaddata它时可以做什么:

  • 更新数据(只要它遵守唯一性约束)。Django 将使用pk匹配对象并替换之前的对象而不调用任何pre_save函数(所以这也是不建议使用它的另一个原因)
  • 创建数据(具有与之前相同的约束)

修改夹具并调用loaddata它时不能执行的操作:

  • 您无法显式删除带有夹具的对象。由于pk要删除的对象不在文件中,因此它将按原样保留在数据库中。所以你必须手动删除它。


Tom*_*lch 5

夹具仅适用于全新数据库实例的初始数据,例如运行测试时。要修改现有数据,请使用迁移。

  • 嗯,我认为迁移是为了模型等方面的变化而进行的。我将研究数据迁移。 (3认同)
  • 不,你不使用管理员。就像我说的,你写一个数据迁移。 (2认同)