python - 使用Django ORM的bulk_create函数创建后如何高效地获取对象?

标签 python django database django-models orm

我必须在表中插入多个对象,有两种方法可以做到这一点 -

1) 使用 save() 插入每一个。但在这种情况下,将会有 n 个对象的 n sql dB 查询。

2) 使用 bulk_create() 将它们全部插入在一起。在这种情况下,将对 n 个对象进行一个 sql dB 查询。

显然,第二个选项更好,因此我正在使用它。现在bulk__create的问题是它不返回插入对象的id,因此它们不能进一步用于创建其他模型的对象,这些模型具有所创建的外键对象。

为了克服这个问题,我们需要获取由 bulk_create 创建的对象。

现在的问题是“假设在我的情况下,没有办法唯一标识创建的对象,我们如何获取它们?”

目前我正在维护一个时间戳来获取它们,如下所示-

my_objects = []

# Timestamp to be used for fetching created objects
time_stamp = datetime.datetime.now()

# Creating list of intantiated objects
for obj_data in obj_data_list:
    my_objects.append(MyModel(**obj_data))

# Bulk inserting the instantiated objects to dB
MyModel.objects.bulk_create(my_objects)

# Using timestamp to fetch the created objects
MyModel.objects.filter(created_at__gte=time_stamp)

现在效果很好,但在一种情况下会失败。

  • 如果在批量创建这些对象时,从其他地方创建了更多对象,那么这些对象也将在我的查询中获取,这是不希望的。

有人能想出更好的解决方案吗?

最佳答案

由于 bulk_create 不会创建主键,因此您必须自己提供键。

如果您不使用默认生成的主键(AutoField),则此过程很简单。

如果您坚持使用默认值,则需要将代码包装到原子事务中并自己提供主键。这样您就会知道插入了哪些记录。

from django.db import transaction

inserted_ids = []

with transacation.atomic():
   my_objects = []
   max_id = int(MyModel.objects.latest('pk').pk)
   id_count = max_id
   for obj_data in obj_data_list:
       id_count += 1
       obj_data['id'] = id_count
       inserted_ids.append(obj_data['id'])
       my_objects.append(MyModel(**obj_data))
   MyModel.objects.bulk_create(my_objects)
   inserted_ids = range(max_id, id_count)

关于python - 使用Django ORM的bulk_create函数创建后如何高效地获取对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32857905/

相关文章:

python - PyCUDA 和 NumbaPro CUDA Python 有什么区别?

python - 根据其他列中的值平均某些列

django-cms 编辑器和 HTML 数据属性清理

python - 如何在 Django 中向 UserCreationForm 添加字段?

sql - 如何在sql语句中嵌套AND/OR

python - 在django模型中使用python super 函数

python - 怀疑函数顺序/while 循环会导致游戏失败

python - Django:尝试读取模板 500.html 时出现 UnicodeDecodeError

database - Sqlite 中的 LIKE 运算符,空格字符除外

使用 JPA 和 MySQL 的 Java 应用程序错误代码 1054