Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django get_或_create-对象列表的性能优化_Python_Sql_Database_Django - Fatal编程技术网

Python django get_或_create-对象列表的性能优化

Python django get_或_create-对象列表的性能优化,python,sql,database,django,Python,Sql,Database,Django,考虑以下(伪Python)代码: 假设大部分时间都会检索对象,而不是创建对象 通过使用par1定义的集合之外的对象的第一个SELECT()进行查询,然后批量插入缺少的对象,可以明显提高性能 但是,有没有一种简洁的Python/Django模式可以在不深入SQL的情况下实现这一点 这是一个批量导入例程,因此l包含字典,而不是django模型实例 给定一个ID列表,您可以使用Django使用\u in操作符快速提供相应的模型实例: 您可以使用对象创建复杂查询,以选择现有行。比如: query_par

考虑以下(伪Python)代码:

假设大部分时间都会检索对象,而不是创建对象

通过使用par1定义的集合之外的对象的第一个SELECT()进行查询,然后批量插入缺少的对象,可以明显提高性能

但是,有没有一种简洁的Python/Django模式可以在不深入SQL的情况下实现这一点


这是一个批量导入例程,因此l包含字典,而不是django模型实例

给定一个ID列表,您可以使用Django使用
\u in
操作符快速提供相应的模型实例:

您可以使用对象创建复杂查询,以
选择现有行。比如:

query_parameters = Q()
for i in l:
    query_parameters |= Q(first=i['this']) & Q(second=i['that'])

found = MyModel.objects.filter(query_parameters)
然后,您可以(在Python中)找出缺少的行,并
create()
它们(或者为了效率,或者
get\u或\u create()
如果存在潜在的竞争条件)


当然,长时间复杂的查询本身可能会有性能问题,但我想这比为每个项目单独查询要快。

是的,但是如果有两个参数,这两个参数都需要匹配,那该怎么办?不。在这种情况下,我会做一些变化,看看哪种最简单;你最初的想法。如果你找到捷径,请告诉我!可能重复的
photos_exist = Photo.objects.filter(
            id__in=photo_ids
            )
query_parameters = Q()
for i in l:
    query_parameters |= Q(first=i['this']) & Q(second=i['that'])

found = MyModel.objects.filter(query_parameters)