Django-ORM:检查数据库中是否有多个项目同时最小化调用

时间:2018-10-14 11:50:41

标签: django django-orm

假设通过外部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

但是必须有更好的方法..

1 个答案:

答案 0 :(得分:1)

您可以使用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)