Django ORM是否在sqlwhere子句中先映射deleted字段?

2024-05-12 22:55:45 发布

您现在位置:Python中文网/ 问答频道 /正文

Django ORM将映射此查询集

TestModel.objects.filter(module="test", deleted=False)

对于此原始sql:

select coll1, coll2, coll3 from test_module where (TestModel.deleted=0 and TestModel.module="test")

无论您将“deleted”放在filter paras中的何处,它都会首先出现在where子句中。你知道吗

我的第一个猜测是Django把所有的bool/tinyint字段放在其他字段之前,但测试显示不是这样。似乎Django只是把名为“deleted”的字段放在了其他人的前面。很奇怪,但为什么?你知道吗

因为我正在向mysql表添加索引,所以顺序非常重要。你知道吗


Tags: djangotestfalsesqlobjectsormfilterwhere
1条回答
网友
1楼 · 发布于 2024-05-12 22:55:45

关键字参数作为字典处理,字典具有任意顺序。deleted键恰好排在该顺序的第一位:

>>> {'module': 'Test', 'deleted': False}
{'deleted': False, 'module': 'Test'}

字典中的排序由它们在基础哈希表中哈希到的槽决定。一个小字典从8个槽开始,'deleted'散列到槽0,'module'散列到槽6:

>>> hash('module') % 8
6
>>> hash('deleted') % 8
0

换句话说,由于Python字典的具体实现细节,首先列出'deleted'完全是巧合。Django并不是故意先列出那一列。你知道吗

顺序在这里并不重要,SQL数据库也不在乎什么是第一位的。你知道吗

相关问题 更多 >