了解django交易

时间:2015-02-18 10:23:27

标签: django transactions

我对使用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是否相等?

由于

2 个答案:

答案 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
    ])