代码之家  ›  专栏  ›  技术社区  ›  zerohedge

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

  •  0
  • zerohedge  · 技术社区  · 6 年前

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

    resp = ['123', '67283', '99829', '786232']
    

    这些是 external_id Article 模型。其中一些可能已经存在于数据库中,而另一些则不存在。

    外部\u 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 回复  |  直到 6 年前
        1
  •  1
  •   catavaran    6 年前

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