【问题标题】:In django 1.2.1 how can I get something like the old .as_sql? [duplicate]在 django 1.2.1 中,我怎样才能得到类似旧的 .as_sql 的东西? [复制]
【发布时间】:2011-03-29 07:39:43
【问题描述】:

在过去的 django 版本中,您可以构建一个查询集,然后对其执行 .as_sql() 以找出最终查询。

在 Django 1.2.1 中有一个函数 ._as_sql() 返回类似但不一样的东西。

在过去的版本中:

qs=Model.objects.all()
qs.as_sql() ====>

SELECT `model_table.id`, `model_table.name`, `model_table.size` from model_table

这向我展示了很多信息。

但是如果我在 Django 1.2.1 中尝试一下

from django.db import connections
con=connections['default']

qs=Model.objects.all()
qs._as_sql(con) ====>

SELECT U0.`id` from model_table U0

这并没有告诉我实际选择了哪些字段。我知道这些信息在某处可用,因为在模板中,我仍然可以这样做:

{% for q in sql_queries %}
    {{q.time}} - {{q.sql}}
{% endfor %}

它向我显示了查询的完整版本(包括选定的字段)

我的问题是,我怎样才能在 shell 中获得这个完整版本?

【问题讨论】:

  • SELECT U0.'id' from model_table U0 如何不显示正在选择的字段?正在选择 model_table.id。如果使用与您的第一个查询相同的三个字段,它将看起来像 SELECT U0.'id', U0.'name', U0.'size' from model_table U0
  • 我认为仅仅选择 id 是不够的。稍后实际发生的是正在选择完整信息。例如 qs=Model.objects.select_related().all() qs._as_sql(con) =====> SELECT U0.id from model_table U0 显然这不是select_related的预期功能,对吧?
  • 我需要它的原因是因为我正在尝试调试一个将 defer / 仅与注释结合的查询,而我可以看到 django 生成的唯一 sql 是新的 'select id' 类型的东西实际上没有查看它尝试选择的字段。
  • 另见groups.google.com/group/django-users/msg/47ab48453367fdd9,其中提到了多数据库案例。

标签: python django


【解决方案1】:
qs=Model.objects.all()
qs.query.as_sql() 

应该做的工作as it is shown here

编辑:

我只是尝试它并得到同样的错误。

qs=Model.objects.all()
print qs.query

这必须给你你想要的(:

【讨论】:

  • 你用的是什么版本的 django?在 1.2.1 中,您的代码生成 'Query' 对象没有属性 'as_sql'
  • 抱歉未经测试的代码。检查我的编辑。
  • 如果此解决方案符合您的需求,请将其标记为已回答
  • 准确地说是str(qs.query)。见stackoverflow.com/questions/2900057/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2013-12-30
  • 2012-10-02
  • 2021-07-12
  • 1970-01-01
相关资源
最近更新 更多