【问题标题】:How do I write my Django query when the WHERE clause is meant to have a function?当 WHERE 子句具有功能时,如何编写 Django 查询?
【发布时间】:2019-03-17 18:28:54
【问题描述】:

我正在使用 Django 和 Python 3.7 以及 PostGres 9.5。我的 PostGres 表中有一个文本类型的列,它记录文章的 URL。我想运行一个查询来比较查询字符串之前的所有内容,例如

SELECT * FROM article where regexp_replace(url, '\?.*$', '') = :url_wo_query_info

但我不确定如何在 Django 中实现这一点。通常,如果我只想对一个 URL 进行直接查询,我可以写

Article.objects.filter(url=url)

但是我不确定如何用 Django 的术语来执行上述操作,因为涉及到更复杂的功能。

【问题讨论】:

    标签: python sql django python-3.x postgresql


    【解决方案1】:

    您可以将 Func 与 F 表达式一起使用,以在模型字段上使用数据库函数。您的查询在 Django ORM 中将如下所示:

    Article.objects.all().annotate(
        processed_url=Func(
            F('url'),
            Value('\?.*$'), Value(''),
            function='regexp_replace',
        )
    ).filter(processed_url=url_wo_query_info)
    

    【讨论】:

    • 谢谢。语句的“Article.objects.all()”部分是否实际上对数据库运行查询,提取其所有记录,然后基于该函数运行第二个查询?
    • 不,在 Django 中,只有当您尝试使用它时才会执行查询,即读取它的值或将其转换为列表等。只有最新版本的查询,经过所有过滤器、注释、排除等语句考虑在内,被执行
    猜你喜欢
    • 2019-09-02
    • 2019-08-01
    • 2018-08-14
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2021-09-21
    • 2020-05-13
    相关资源
    最近更新 更多