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 和 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()
解决方案
我不确定我是否正确理解了您的问题。但是您可以使用单个保存方法调用来执行原子事务。
- 例如像这样:
user.save(update_fields=('is_active', 'profile__is_active'))
如果您想更好地理解这个问题,请查看 Django 源代码:https ://github.com/django/django/blob/main/django/db/models/base.py#L763
推荐阅读
- django - django 序列化程序中的对象级验证无法识别函数
- python - 在 Python 中指定参数后,有没有办法修改参数的函数?
- ios - 如何在快速点击按钮时访问数组数据数组中的当前行元素?
- c# - Asp.Net Core 3-1 - 将 Guid 返回到控制器的其他操作视图?
- javascript - 电子邮件中的链接以响应组件
- python-3.x - Python:将 IP 地址列表传递给 geoip2 以进行位置查找
- android - 在 android 上运行 React-Native 应用程序显示“对象不可迭代”
- homebrew - linux上的swagger-codegen,安装问题
- angular - Angular 工作区 - 多个项目的路径配置
- javascript - 在javascript(客户端ReactJS)中克隆对象数组的索引并使用map方法返回基于新数组的视图