【问题标题】:Bulk creating related models in Django在 Django 中批量创建相关模型
【发布时间】:2016-08-15 22:38:36
【问题描述】:

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

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 对象?

这里不能选择去规范化模型,因为数据模型比描述的要复杂一些。

【问题讨论】:

  • bulk_insert 我想你的意思是bulk_create 方法?
  • 当然是的:)。那么当你使用well-known id这个词时,你怎么不知道它是否存在呢?还是您只是指用于a_id 的整数?但是这个整数值是怎么到这里的呢?
  • @AKS 请注意,这不是自增字段,而是业务逻辑的一部分。具体来说,它源自用于创建 B 对象的属性。

标签: python django django-models


【解决方案1】:

这是一种骇人听闻的方式,但这样的方式应该比在循环中使用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)

【讨论】:

  • 这是我将要测试的一种可能方法。
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 2023-03-17
  • 2021-10-26
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多