gpt4 book ai didi

python - Django ORM 的结果不一致

转载 作者:行者123 更新时间:2023-11-29 22:33:11 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

关于python - Django ORM 的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29658608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com