首页 > 解决方案 > 一次更新一对相关对象的原子事务

问题描述

我有一个简单的任务 - 将所有用户及其配置文件标记为“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 和 user.profile 的 is_active 并不总是同步

我能想到的最好的计划是将两个 .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()

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

标签: django

解决方案


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

  • 例如像这样:
user.save(update_fields=('is_active', 'profile__is_active'))

如果您想更好地理解这个问题,请查看 Django 源代码:https ://github.com/django/django/blob/main/django/db/models/base.py#L763


推荐阅读