【问题标题】:Inconsistent results from Django ORM来自 Django ORM 的结果不一致
【发布时间】:2015-06-21 21:48:29
【问题描述】:

谁能解释一下这种不寻常的行为?我正在调试一个 Django 管理器,似乎 ORM 正在更改它为同一查询返回的结果。查看以下一系列命令(在测试期间在调试器中运行):

第一行是一个命令,它应该返回与带有特定 uuid 标记的最近会话关联的成员。这里使用的两个 uuid 是 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 作为数据库。

【问题讨论】:

  • 很难说。你能再给我们看一些代码吗,比如你的模型和你的get_or_create_by_uuid()方法?
  • 好的,我只使用 Django ORM 管理器方法重新创建了这个问题。

标签: python mysql django orm django-orm


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多