Django ORM的结果不一致

时间:2015-04-15 19:00:22

标签: python mysql django orm django-orm

任何人都可以对这种不寻常的行为有所了解吗?我正在调试一个Django管理器,似乎ORM正在改变它为同一个查询返回的结果。查看以下一系列命令(在测试期间在调试器中运行):

第一行是一个命令,它应该返回与用特定uuid标记的最近会话相关联的成员。这里的两个uuids是uuid1 = 1234catuuid2=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作为数据库,如果有帮助的话。

1 个答案:

答案 0 :(得分:0)

我可以通过将order_by('knz_updated_at)子句更改为order_by('knz_updated_at', 'id')来解决问题。

似乎在两个对象都在同一秒内更新的情况下,ORM可能不明确它返回的值(因为Django DateTimeField只将分辨率存储到第二个)。将id添加到排序可确保在更新时间相同的情况下,将返回最近创建的对象。