Django:loaddata更新数据

时间:2016-01-29 16:53:15

标签: 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},
# ...

那变成了:

{"fields": {"name": "Field 1"},"model": "catalog.product","pk": 1},
{"fields": {"name": "Field 2"},"model": "catalog.product","pk": 2},
# ...

但我得到了:

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

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

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

我如何实现我的目标?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

在这么多年之后到达那里并且有一个未解决的问题让我想添加一些东西,因为我也确实在固定装置上很挣扎。

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

不过,当您刚接触 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},
# ...

变成了:

{"fields": {"name": "Field 1"},"model": "catalog.product","pk": 1},
{"fields": {"name": "Field 2"},"model": "catalog.product","pk": 2},
# ...

在这里,问题确实是尝试使用已存在于另一个对象(带有 pk = 3 的对象)上的主键更新对象。您不能仅使用夹具删除带有 pk = 3 的对象。如果你这样做了,那么上面更新的装置就会起作用。

这里有一些规则可以提供帮助。

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

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

修改夹具并对其调用 loaddata 时不能做什么:

  • 您不能显式删除带有夹具的对象。由于您要删除的对象的 pk 不在文件中,它会在数据库中保持原样。所以你必须手动删除它。