有没有人能解释一下这种不寻常的行为?我正在调试一个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作为数据库,如果有帮助的话。
发布于 2015-04-16 22:00:30
我能够通过将order_by('knz_updated_at)子句更改为order_by('knz_updated_at', 'id')来解决这个问题。
似乎,在两个对象在同一秒内更新的情况下,对象关系映射对于它返回的值可能是模棱两可的(因为Django DateTimeField只将分辨率存储到第二个值)。将id添加到排序中可以确保在更新时间相同的情况下,将返回最近创建的对象。
https://stackoverflow.com/questions/29658608
复制相似问题