我对使用transaction.atomic()理解有一个小问题。如果我想用像这样的单个事务创建批量对象
emails = [1, 2, 3, 4, 5]
for email in emails:
Users.objects.create(email=email)
1)上面的代码在每次迭代时创建并执行查询。因此,每个电子邮件的datetimefield将有所不同。这是对的吗?
但是,如果我使用:
with transaction.atomic():
emails = [1, 2, 3, 4, 5]
for email in emails:
Users.objects.create(email=email)
我问的原因是我有一个背景芹菜任务,它通过循环迭代为多个用户创建通知,我发现它效率不高。所以我想知道它是否会在单个事务中执行,如果是,那么在事务中创建的每个通知的datetimefield是否相等?
由于
答案 0 :(得分:2)
您可以使用Model.objects.bulk_create
:
此方法将提供的对象列表插入到数据库中 一种有效的方式(通常只有一个查询,无论多少 对象有:)
Users.objects.bulk_create([
Users(email=email) for email in [1, 2, 3, 4, 5]
])
答案 1 :(得分:1)
在两种情况下,每个用户的日期时间字段都不同。如果您希望每个用户使用相同的日期时间,则必须手动传递它:
with transaction.atomic():
emails = [1, 2, 3, 4, 5]
now = timezone.now()
Users.objects.bulk_create([
Users(email=email, date_joined=now) for email in emails
])