获取 Django 中 .exists() 查询生成的 SQL 语句

fre*_*ley 8 django django-orm

是否可以在 Django 中打印由 queryset.exists() 语句生成的 SQL?

mik*_*725 -5

通常是的,您可以打印 SQLQuerySet生成,但是由于exists()不返回 aQuerySet而是返回一个简单的布尔值,因此更加困难。

也许最简单的方法不是只打印 SQL 查询,exists()而是打印视图中的所有查询。您可以按照其他 SO 问题了解如何执行此操作(示例),或者您可以使用django-debug-toolbar


如果您还对打印查询生成感兴趣QuerySet,您可以使用以下命令打印完整的 SQL 查询:

print(Model.objects.filter(...).exists().query)
Run Code Online (Sandbox Code Playgroud)

这将打印一个完整的查询。

但是,如果您的目的是能够复制粘贴查询并直接执行它,则它可能并不总是有效。例如,打印查询并不总是产生正确的语法,例如日期。然而,Django 对象中还有另一个有用的方法Query(它是QuerySet.query的实例)- sql_with_params()。这将返回带有参数本身的参数化查询。例如:

sql, params = Model.objects.filter(...).exists().query.sql_with_params()
Model.objects.raw(sql, params=params)
Run Code Online (Sandbox Code Playgroud)

  • `Model.objects.filter().exists()` 将返回一个布尔值。访问布尔值的 .query() 将给出“AttributeError”。或不? (11认同)