django get_or_create - 对象列表的性能优化

时间:2014-07-01 04:50:45

标签: python sql database django

考虑以下(pseudoPython)代码:

l = [some, list]
for i in l:
    o, c = Model.objects.get_or_create(par1=i["something"], defaults={'par2': i["else"],})

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

通过查询不在par1定义的集合中的第一个SELECT()对象,然后批量插入缺少的对象,可以获得明显的性能提升。

但是,有没有一个完整的Python / Django模式完成,而不会深入SQL?

这是一个批量导入例程,所以我包含字典,而不是django模型实例。

2 个答案:

答案 0 :(得分:1)

给定一个ID列表,您可以使用Django使用__in运算符快速为您提供相应的Model实例:https://docs.djangoproject.com/en/dev/ref/models/querysets/#in

photos_exist = Photo.objects.filter(
            id__in=photo_ids
            )

答案 1 :(得分:0)

您可以使用Q个对象为SELECT现有行创建复杂查询。类似的东西:

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()它们(或bulk_create()的效率,或get_or_create()如果存在潜在的竞争条件)。

当然,长期复杂的查询可能会出现自己的性能问题,但我认为对每个项目进行单独查询会更快。