考虑以下(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模型实例。
答案 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()
如果存在潜在的竞争条件)。
当然,长期复杂的查询可能会出现自己的性能问题,但我认为对每个项目进行单独查询会更快。