繁体   English   中英

Django:loaddata 更新数据

[英]Django : loaddata to update data

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

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

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

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

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

对于修改现有数据,正如@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不在文件中,因此它将保持在数据库中。 所以你必须手动删除它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM