首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-ORM:检查多个项是否在DB中,同时最小化调用

Django-ORM:检查多个项是否在DB中,同时最小化调用
EN

Stack Overflow用户
提问于 2018-10-14 11:50:40
回答 1查看 42关注 0票数 0

假设通过外部API调用,我们得到以下响应:

代码语言:javascript
复制
resp = ['123', '67283', '99829', '786232']

这些是对象的external_id字段,在Article模型中定义。其中一些可能已经存在于数据库中,而另一些则不存在。

在返回响应之前,我们需要检查每个external_id是否对应于数据库中的一个记录,如果不是,我们需要创建它并从另一个第三个源获取其他信息。

做这件事最有效的方法是什么?现在我想不出比这更好的事情了:

代码语言:javascript
复制
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

但一定有更好的方法..?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-14 12:03:16

您可以在此任务中使用集合。以下代码将只发出一个数据库调用:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52802333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档