Django ORM“filter”方法生成不带引号的SQL查询

cuxqih21  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(159)

我正在用Django构建一个应用程序,它依赖于几个我不管理的PosgreSQL数据库,我们称它们为数据库A和数据库B。对于每个数据库,我都使用python manage.py inspectdb来构建我的models.py文件。
我正在尝试使用Django ORM来执行以下查询(* 这里大大简化了 *),to_date是一个datetime.datetime对象:

  1. sample = my_model_in_B.objects\
  2. .filter(a_column=instance_of_a_model_in_A.name)\
  3. .exclude(another_column='Useless things')\
  4. .filter(a_column_with_dates__lte=to_date)

我的问题是它会生成以下SQL查询:

  1. SELECT "myschema"."mytable"."a_column", "myschema"."mytable"."another_column" from "myschema"."mytable"
  2. WHERE "myschema"."mytable"."a_column" = Here is the name of instance_of_a_model_in_A
  3. AND "myschema"."mytable"."a_column_with_dates" <= 2020-02-03
  4. AND NOT ("myschema"."mytable"."another_column" = Useless things
  5. AND "myschema"."mytable"."another_column" IS NOT NULL))

换句话说,我的问题是Django ORM没有在我需要的地方自动添加引号。我不明白我做错了什么。我不知道这是否重要,但请注意:

  • 我使用Django2.2,我数据库B只有POSTGRESQL8,
  • 我使用的所有列都对应于我的模型中的CharField,除了 a_column_with_dates,它对应于DateField
pkmbmrz7

pkmbmrz71#

实际上,我最初的问题措辞错误,而且容易误导人。我以为QuerySet.query(我用来得到上面的SQL代码)应该返回Django ORM后面的有效SQL查询,但事实并非如此。它的目的只是提供查询的基本表示,尽管如此,来自Django项目官方网站上的一条评论:
Django实际上从不插入参数:它将查询和参数分别发送到数据库适配器,由数据库适配器执行相应的操作。
的确,从官方文件来看:
QuerySet得查询参数存在,以便专用查询子类可以重新构造内部查询状态.该参数得值是该查询状态得不透明表示形式,不是公共API得一部分.

相关问题