Django:删除JSON中不存在的数据库行

kg7wmglp  于 2023-03-04  发布在  Go
关注(0)|答案(1)|浏览(118)

作为Django项目的一部分,我想将API数据镜像到本地数据库。
我已经设法更新唯一键上的数据,但我正在努力如何从数据库中删除API文件中不再存在的数据。
为了说明这一点,让我们使用当前的API数据,如下所示:

[
  {
    "foo": "Lorem",
    "bar": "ipsum",
  },
  {
    "foo": "dolor",
    "bar": "newvalue"
  },
  {
    "foo": "adipiscing",
    "bar": "elit"
  }
]

和现有数据库记录(foo是唯一键列):

| id | foo   | bar          |
-----------------------------
| 1  | Lorem | ipsum        |
| 2  | dolor | sit          |
| 3  | amet  | consectetuer |

在这种情况下,将更新id为1和2的行(在此过程中将sit重写为newvalue),并插入adipiscingelit的新行。
问题是:有没有什么好的做法来确定和删除(批量)像id 3这样的行(例如唯一键amet),这些行在(新更新的)输入中不再存在?

oalqel3c

oalqel3c1#

要获得API数据foo密钥的值:

api_foo_values = [data["foo"] for data in api_data]

现在你想删除那些已经不在API数据中的变量,只需要排除那些仍然在API数据中的变量,如下所示:

YourModel.objects.exclude(foo__in=api_foo_values)

你将拥有所有foo值不在API数据中的对象。只需对该QuerySet调用delete,如下所示:

YourModel.objects.exclude(foo__in=api_foo_values).delete()

它会做你想做的。
没有像bulk_createbulk_update那样的bulk_delete
另外,如果你想你可以检索foo列的列表如下:

YourModel.objects.all().values_list("foo", flat=True)

这将输出QuerySet("lorem", "dolor", "amet")。将其视为foo列的所有当前值。

相关问题