【发布时间】:2015-06-21 21:48:29
【问题描述】:
谁能解释一下这种不寻常的行为?我正在调试一个 Django 管理器,似乎 ORM 正在更改它为同一查询返回的结果。查看以下一系列命令(在测试期间在调试器中运行):
第一行是一个命令,它应该返回与带有特定 uuid 标记的最近会话关联的成员。这里使用的两个 uuid 是 uuid1 = 1234cat 和 uuid2=9876dog。您将看到在这一系列命令的最后,完全相同的命令开始返回不同的值。没有更改任何数据,除了您在此处看到的命令外,我没有输入任何内容。
ipdb> Session.objects.filter(uuid=uuid2).order_by('knz_updated_at').last().member
<Member: (681) , INACTIVE>
ipdb> Session.objects.filter(uuid=uuid2).order_by('knz_updated_at')
[<Session: (681) , INACTIVE, 9876dog>, <Session: (680) , INACTIVE, 9876dog>]
ipdb> Session.objects.filter(uuid=uuid2).order_by('knz_updated_at').last()
<Session: (681) , INACTIVE, 9876dog>
ipdb> Session.objects.filter(uuid=uuid2).order_by('knz_updated_at').last()
<Session: (681) , INACTIVE, 9876dog>
ipdb> Session.objects.filter(uuid=uuid2).order_by('knz_updated_at').last()
<Session: (681) , INACTIVE, 9876dog>
ipdb> Session.objects.filter(uuid=uuid2).order_by('knz_updated_at').last()
<Session: (681) , INACTIVE, 9876dog>
ipdb> Session.objects.filter(uuid=uuid2).order_by('knz_updated_at').last()
<Session: (681) , INACTIVE, 9876dog>
# RESULT CHANGES
ipdb> Session.objects.filter(uuid=uuid2).order_by('knz_updated_at').last()
<Session: (680) , INACTIVE, 9876dog>
ipdb> Session.objects.filter(uuid=uuid2).order_by('knz_updated_at').last()
<Session: (680) , INACTIVE, 9876dog>
ipdb> Session.objects.filter(uuid=uuid2).order_by('knz_updated_at').last().member
<Member: (680) , INACTIVE>
同样奇怪的是,单独运行测试或仅针对 member 应用程序运行测试时不会发生此错误。只有当我为整个项目运行测试套件时才会出现这个问题。
如果有帮助,我们将使用 MySQL 作为数据库。
【问题讨论】:
-
很难说。你能再给我们看一些代码吗,比如你的模型和你的
get_or_create_by_uuid()方法? -
好的,我只使用 Django ORM 管理器方法重新创建了这个问题。
标签: python mysql django orm django-orm