Skip to main content
 首页 » 编程设计

python之在 Django 中批量创建相关模型

2024年10月24日34zfyouxi

考虑两个简单的相关模型:

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)