【问题标题】:Django ORM "filter" method produces SQL query without quotesDjango ORM“过滤器”方法生成不带引号的 SQL 查询
【发布时间】:2020-05-18 20:47:30
【问题描述】:

我正在使用 Django 构建一个应用程序,它依赖于几个我不管理的 PosgreSQL 数据库,我们称它们为数据库 A 和数据库 B。对于每个数据库,我都使用了python manage.py inspectdb 来构建我的models.py 文件。

我正在尝试使用 Django ORM 来执行以下查询(此处已大大简化),to_datedatetime.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 不会在我需要的地方自动添加引号。我不明白我做错了什么。我不知道这是否重要,但请注意:

  • 我使用 Django 2.2。而我的数据库 B 仅是 POSTGRESQL 8,
  • 我使用的所有列都对应于我的模型中的CharField,除了对应于DateFielda_column_with_dates

任何帮助表示赞赏。提前谢谢你。

【问题讨论】:

  • 您找到解决方案了吗?我发现了这个问题code.djangoproject.com/ticket/17612,但它已有 10 年历史,并且由于指向文档中提到您应该手动转义此类事情的链接无效而被关闭,因为底层数据库驱动程序可能是问题的原因,而不是 django。但该链接现在也已断开。
  • @Som-1 是的,我可能找到了对你有帮助的东西,请在下面查看我的答案。

标签: django postgresql orm


【解决方案1】:

实际上,我最初的问题措辞错误且具有误导性。我假设QuerySet.query(我用来获取上面的 SQL 代码)应该返回 Django ORM 后面的有效 SQL 查询,但事实并非如此。它只是旨在提供查询的基本表示,尽管如此,from a comment made on the official Django project website:

Django 从不实际插入参数:它发送查询 并将参数分别发送给数据库适配器,该适配器执行 适当的操作。

确实,来自official documentation

QuerySet 的查询参数存在,以便专门的查询子类可以重建内部查询状态。该参数的值是该查询状态的不透明表示,不是公共 API 的一部分。

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2018-12-19
    • 2021-05-26
    • 2021-08-11
    • 2021-12-19
    • 2021-12-16
    • 2020-03-16
    • 2020-12-27
    相关资源
    最近更新 更多