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
因此在添加一些数据时没有问题,但在尝试删除某些数据时,与主键存在冲突.
我怎样才能实现我想做的事情?
这么多年过去了,带着一个未解决的问题来到这里,让我想补充一些东西,因为我也确实在赛程方面遇到了困难。
对于修改现有数据,正如 @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它时可以做什么:
pk匹配对象并替换之前的对象而不调用任何pre_save函数(所以这也是不建议使用它的另一个原因)修改夹具并调用loaddata它时不能执行的操作:
pk要删除的对象不在文件中,因此它将按原样保留在数据库中。所以你必须手动删除它。夹具仅适用于全新数据库实例的初始数据,例如运行测试时。要修改现有数据,请使用迁移。