同一模型的多个内存实例

时间:2016-09-15 13:18:13

标签: python django django-models

假设我有一个修复用户模型的用户名和电子邮件的流程。

def fix_model(user_id):
    user = User.objects.get(user_id)
    fix_username(user)
    # lets say for arguments' sake that we can't pass the user to fix_email (call it legacy)
    fix_email(user_id)
    user.save()

def fix_username(user):
    user.username = 'correct_username'

def fix_email(user_id):
    user = User.objects.get(user_id)
    user.email = 'correct_email'
    user.save() # <-- necessary because it is a standalone task

当然会发生的情况是,用户将首先保存在修复电子邮件调用中,然后使用正确的用户名保存内存对象。当我们之后检查数据库后,我们将不再拥有正确的电子邮件地址。

当然这是一个人为的例子。有很多简单的方法可以在这里修复它,例如将user.save()向上移动一行或在fix_email等中返回用户的实例。 在我的实际使用案例中,我无法直接控制何时保存模型或方法的签名。

我的问题如下:在Django中是否有一种方法可以让从数据库中检索的所有实例都通过一个类型的管理器,这将返回指向内存对象中相同的指向所有get调用。在保存/刷新时,它将更新内存中实例,以便所有现有指针也将被更改。

我想要这样的东西:

u1 = User.objects.get(id=user_id)
u1.username = 'correct_username'
u2 = User.objects.get(id=user_id)
assert u2.username == 'correct_username'
u2.refresh_from_db()
assert u1.username != 'correct_username'

编辑: 在我的特定用例中,fix_email方法的等价物是一个昂贵的独立任务,它按计划(异步)运行,但也可以包含在一般流程中,如fix_model()正在执行(同步)。

0 个答案:

没有答案