我正在用Django构建一个应用程序,它依赖于几个我不管理的PosgreSQL数据库,我们称它们为数据库A和数据库B。对于每个数据库,我都使用python manage.py inspectdb
来构建我的models.py
文件。
我正在尝试使用Django ORM来执行以下查询(* 这里大大简化了 *),to_date
是一个datetime.datetime
对象:
sample = my_model_in_B.objects\
.filter(a_column=instance_of_a_model_in_A.name)\
.exclude(another_column='Useless things')\
.filter(a_column_with_dates__lte=to_date)
我的问题是它会生成以下SQL查询:
SELECT "myschema"."mytable"."a_column", "myschema"."mytable"."another_column" from "myschema"."mytable"
WHERE "myschema"."mytable"."a_column" = Here is the name of instance_of_a_model_in_A
AND "myschema"."mytable"."a_column_with_dates" <= 2020-02-03
AND NOT ("myschema"."mytable"."another_column" = Useless things
AND "myschema"."mytable"."another_column" IS NOT NULL))
换句话说,我的问题是Django ORM没有在我需要的地方自动添加引号。我不明白我做错了什么。我不知道这是否重要,但请注意:
- 我使用Django2.2,我数据库B只有POSTGRESQL8,
- 我使用的所有列都对应于我的模型中的
CharField
,除了 a_column_with_dates,它对应于DateField
。
1条答案
按热度按时间pkmbmrz71#
实际上,我最初的问题措辞错误,而且容易误导人。我以为
QuerySet.query
(我用来得到上面的SQL代码)应该返回Django ORM后面的有效SQL查询,但事实并非如此。它的目的只是提供查询的基本表示,尽管如此,来自Django项目官方网站上的一条评论:Django实际上从不插入参数:它将查询和参数分别发送到数据库适配器,由数据库适配器执行相应的操作。
的确,从官方文件来看:
QuerySet得查询参数存在,以便专用查询子类可以重新构造内部查询状态.该参数得值是该查询状态得不透明表示形式,不是公共API得一部分.