Django 一次更新一对相关对象的原子事务

Django 一次更新一对相关对象的原子事务,django,Django,我有一个简单的任务-将所有用户及其配置文件标记为“is_active”,我这样做: users = User.objects.all().select_related('profile') for user in users: user.is_active = True user.profile.is_active = True user.save() user_profile.save() 有时它会破坏数据,因此用户的处于活动状态,而用户配置文件的处于活动状

我有一个简单的任务-将所有用户及其配置文件标记为“is_active”,我这样做:

users = User.objects.all().select_related('profile')

for user in users:
    user.is_active = True
    user.profile.is_active = True
    user.save()
    user_profile.save()
有时它会破坏数据,因此用户的处于活动状态,而用户配置文件的处于活动状态并不总是同步

我能想到的最佳方案是将这两个.save()都包装到原子事务中

from django.db import transaction

users = User.objects.all().select_related('profile')

for user in users:
    user.is_active = True
    user.profile.is_active = True
    with transaction.atomic():
        user.save()
        user_profile.save()
那么,它应该工作吗?)问题是-可能是整个块,包括
users=User.objects.all()。select_related('profile')
应该包装在transaction.atomic()中


另外,由于内部逻辑复杂,我无法使用.update()

我不确定是否正确理解了您的问题。 但您可以使用单个save方法调用来执行原子事务

  • 例如:
如果您想更好地理解此问题,请查看Django源代码:

user.save(update_fields=('is_active', 'profile__is_active'))