13

我有一个固定装置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

所以添加一些数据时没有问题,但是尝试删除一些时,与主键发生冲突。

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

4

2 回答 2

5

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

于 2016-01-29T20:28:35.613 回答
5

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

对于修改现有数据,正如@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},
# ...

那变成了:

{"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您要删除的对象不在文件中,它将保持原样在数据库中。所以你必须手动删除它。
于 2021-04-21T17:13:03.083 回答