Django-ORM:在最小化调用的同时检查数据库中是否有多个项目
Django-ORM: Check whether multiple items are in DB while minimizing calls
假设从外部 API 调用,我们得到以下响应:
resp = ['123', '67283', '99829', '786232']
这些是我们对象的 external_id
字段,在我们的 Article
模型中定义。其中一些可能已经存在于数据库中,而另一些则不存在。
在返回响应之前,我们需要检查每个 external_id
是否对应于我们数据库中的一条记录,如果不是,我们需要创建它并从另一个、第三个来源获取额外信息。
最有效的方法是什么?现在我想不出比以下更好的东西了:
for external_id in resp:
if not Article.objects.filter(external_id=external_id).exists():
# item doesn't exist, go fetch more data and create object
else:
# already exists, do something else
但一定有更好的方法..?
您可以使用 sets 完成此任务。以下代码将只发出一个数据库调用:
expected_ids = set(int(pk) for pk in resp)
exist_ids = set(Article.objects.filter(external_id__in=resp)
.values_list('external_id', flat=True))
not_exist_ids = list(expected_ids - exist_ids)
假设从外部 API 调用,我们得到以下响应:
resp = ['123', '67283', '99829', '786232']
这些是我们对象的 external_id
字段,在我们的 Article
模型中定义。其中一些可能已经存在于数据库中,而另一些则不存在。
在返回响应之前,我们需要检查每个 external_id
是否对应于我们数据库中的一条记录,如果不是,我们需要创建它并从另一个、第三个来源获取额外信息。
最有效的方法是什么?现在我想不出比以下更好的东西了:
for external_id in resp:
if not Article.objects.filter(external_id=external_id).exists():
# item doesn't exist, go fetch more data and create object
else:
# already exists, do something else
但一定有更好的方法..?
您可以使用 sets 完成此任务。以下代码将只发出一个数据库调用:
expected_ids = set(int(pk) for pk in resp)
exist_ids = set(Article.objects.filter(external_id__in=resp)
.values_list('external_id', flat=True))
not_exist_ids = list(expected_ids - exist_ids)