【问题标题】:Django : loaddata to update dataDjango:加载数据以更新数据
【发布时间】:2016-05-07 12:07:12
【问题描述】:

我有一个夹具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

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

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

【问题讨论】:

    标签: python django fixtures loaddata


    【解决方案1】:

    这么多年过去了,有一个未解决的问题让我想补充一些东西,因为我也确实在固定装置方面遇到了困难。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 所以,为了真正改变应用程序的初始数据,我需要擦除我的数据库吗?
      • 是的,但是,有时如果我们更新应用程序,初始数据会有一些变化。擦除数据库也会删除非初始数据。当然我可以使用管理界面,但我想在记录上保持干净的主键
      • 不,您不使用管理员。你写了一个数据迁移,就像我说的那样。
      • 好吧,我认为迁移是为了模型的更改而进行的。我将研究数据迁移。
      • @ThePhi 不正确,请阅读文档以了解迁移如何帮助迁移数据以及架构 docs.djangoproject.com/en/3.2/howto/writing-migrations
      猜你喜欢
      • 1970-01-01
      • 2014-11-16
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多