【问题标题】:Django - has the behavior of `Unknown column 'foo.bar' in 'field list'` changed?Django - '字段列表'中的'未知列'foo.bar'的行为是否改变了?
【发布时间】:2023-04-07 13:39:01
【问题描述】:

我有一个查询,我希望引发异常,Unknown column 'foo.bar' in 'field list';但是,现在在 1.4 Django 上,异常似乎被吞没了,并且返回了一个空的查询集。

In [1]: Foo.objects.all()
Out[1]: []

In [2]: from django.db import connection

In [3]: connection.queries
Out[3]: 
[{'sql': 'SELECT ..`foo`.`bar` ...',
  'time': '0.001'}]

同时,数据库中的相同查询:

mysql> SELECT ..`foo`.`bar` ...;
ERROR 1054 (42S22): Unknown column 'foo.bar' in 'field list'

我能否恢复(我认为的)旧行为?

我在哪里错过了发行说明中的​​这一变化?

注意,这不是查询集延迟执行的问题,connection.queries 有一个查询。打印查询集执行查询。

In [1]: from django.db import connection

In [2]: connection.queries
Out[2]: []

In [3]: q = Foo.objects.all()

In [4]: connection.queries
Out[4]: []

In [5]: print q
Out[5]: []

In [6]: connection.queries
Out[6]:
[{'sql': 'SELECT ...

【问题讨论】:

  • 这看起来很奇怪。您是否尝试过使用查询集?换句话说,它只是懒惰,如果您对结果进行迭代,您会看到预期的错误?只是一个想法。希望它可能会有所帮助。
  • 是的,遍历 qs 会产生错误 [o for o in Foo.objects.all()] .. 但 list(Foo.objects.all()) 不会 .. hrm .. 我可以发誓这与以前的版本不同...

标签: mysql django django-models


【解决方案1】:

正如我在评论中提到的,QuerySet 在 Django 中是惰性的。因此,在您尝试使用它之前,您不会收到错误消息(例如,遍历查询集)。这是文档的link

这不是 Django 中的新行为。您可以找到 1.1、1.2 和 1.3 的相同文档

希望这会有所帮助。

【讨论】:

  • Though this looks like three database hits, in fact it hits the database only once, at the last line (print q). - 打印当然会执行 qs。
猜你喜欢
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2013-12-10
  • 2011-04-16
相关资源
最近更新 更多