python - Django ORM 是否将删除的字段映射到 sql where 子句中的其他字段之前?

标签 python mysql django

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/

相关文章:

mysql - 无法在 Windows 上安装 mysql2 for Rails 3

php - SQL JOIN 失败的问题

python - 嵌套字段序列化程序 - 数据丢失

Django 通用外键过滤(v1.5 和 v1.6 之间的差异)

javascript - 如何从 php 服务器打印到 POS 打印机

python - Django 编写自定义装饰器

python - reshape 字典键

python - 清理 1677 年之前日期的不同日期格式时的 Pandas OutOfBoundsDatetime

python - Flask wtform RadioField 标签不呈现

python - 如果一列中有特定值,如何导入 csv 跳过行?