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”放在过滤器参数中的什么位置,它都会在 where 子句中排在首位。
我的第一个猜测是 Django 将所有 bool/tinyint 字段放在其他字段之前,但测试显示没有。似乎 Django 只是将名为“已删除”的字段放在其他人面前。很奇怪,但为什么呢?
因为我正在向 mysql 表添加索引,所以顺序非常重要。
最佳答案
关键字参数作为字典处理,具有任意排序。 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 数据库也不关心什么先出现。
关于python - Django ORM 是否将删除的字段映射到 sql where 子句中的其他字段之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768350/