任何人都可以对这种不寻常的行为有所了解吗?我正在调试一个Django管理器,似乎ORM正在改变它为同一个查询返回的结果。查看以下一系列命令(在测试期间在调试器中运行):
第一行是一个命令,它应该返回与用特定uuid标记的最近会话相关联的成员。这里的两个uuids是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作为数据库,如果有帮助的话。
答案 0 :(得分:0)
我可以通过将order_by('knz_updated_at)
子句更改为order_by('knz_updated_at', 'id')
来解决问题。
似乎在两个对象都在同一秒内更新的情况下,ORM可能不明确它返回的值(因为Django DateTimeField
只将分辨率存储到第二个)。将id
添加到排序可确保在更新时间相同的情况下,将返回最近创建的对象。