考虑两个简单的相关模型:
class A(models.Model):
id = models.IntegerField(primary_key=True)
class B(models.Model):
a = models.ForeignKey(A)
# other fields
在 B 上进行非常大的批量插入之前:
lots_of_b_objects = [B(a_id=1234), B(a_id=5678), ...]
B.objects.bulk_create(lots_of_b_objects)
(请注意,出于性能原因,我从未在批量创建中实际持有 A 对象,我只引用它们众所周知的 id,无论它是否存在)
确保所有相关的 A 对象也存在的高性能方法是什么?
目前我拥有的最佳解决方案是预先确定一组相关的 A 并为每个运行 get_or_create()。这还不够快。有没有更好的方法在执行批量插入之前创建所有 A 对象?
这里不支持对模型进行去规范化,因为数据模型比所描述的稍微复杂一些。
请您参考如下方法:
这是一种 hackish 方式,但像这样的方式应该比在循环中使用 get_or_create 好得多(但它可能因情况而异,所以我不知道这种方式对你是否有效或不)。
existing_As = A.objects.filter(id__in=a_ids).values_list('id', flat=True)
As_to_create = list(set(a_ids) - set(existing_As))
A.objects.bulk_create([A(id=x) for x in As_to_create])
# Now we are sure all the As exist as we just created them, so
lots_of_b_objects = [B(a_id=1234), B(a_id=5678), ...]
B.objects.bulk_create(lots_of_b_objects)
