django 2.1 上的 select_related 不工作

Posted

技术标签:

【中文标题】django 2.1 上的 select_related 不工作【英文标题】:select_related on django 2.1 not working 【发布时间】:2018-08-15 15:02:18 【问题描述】:

我正在使用 Django 2.1 和 Oracle 12C。如果我们有类似的东西,请从 django 文档中获取:

from django.db import models

class City(models.Model):
    # ...
    pass

    def __str__(self):
        return ' '.format(self.fieldA, self.fieldB) #neither field is ever null

class Person(models.Model):
    # ...
    hometown = models.ForeignKey(
        City,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
    )

    def __str__(self):
        return hometown.__str__()

class Book(models.Model):
    # ...
    author = models.ForeignKey(Person, on_delete=models.CASCADE)

然后执行以下任一操作:

Book.objects.select_related('author__hometown').all() Book.objects.select_related('author__hometown').filter(...)

我收到Unable to get repr for <class 'django.db.models.query.QuerySet'> 奇怪的是,Book.objects.select_related('author_hometown').get(pk=123) 有效。 此外,如果我使用 Django 2.0 而不是 2.1,则 所有 查询都有效。有人可以帮忙吗?谢谢。

更新 为模型添加了 str 方法 此外,当我强制评估问题查询时,我得到django.db.utils.DatabaseError: ORA-00918: column ambiguously defined

【问题讨论】:

您是否通过任何更改覆盖了CityPerson 和/或Book__str__ 和/或__repr__?问题不在于 QuerySet 本身,而是在外壳中打印它。 你是绝对正确的......我确实覆盖了这些方法,当我将它们注释掉时,一切正常......但你知道为什么这对于 2.1 是必要的,以及我如何在没有的情况下覆盖这些方法错误? 我仍然不确定这与 Django-2.1 有什么关系。我认为如果您在 2.0 中进行相同的查询,您将得到相同的错误。如果您可以分享相关的__repr__ 和/或__str__,我或许可以尝试帮助您找到问题所在。例如,这可能意味着您想将一个字符串和一个 None 添加在一起(或类似的东西)。 感谢您的帮助...我更新了模型并在更新部分添加了更多信息...奇怪的是当我切换虚拟环境时(从 Django 2.0 而不是 Django 2.1 ,所有其他包都一样)问题消失了 【参考方案1】:

错误ORA-00918: column ambiguously defined表示正在生成的查询正在从多个表中提取数据,并且在查询中的多个表中使用相同名称定义的字段之一正在在查询中使用而没有附加表限定符。例如

SELECT ORDER_NUMBER, ITEM_NUMBER, ORDERED_COUNT
  FROM ORDER o
  INNER JOIN ORDER_DETAIL d
    ON d.ORDER_NUMBER = o.ORDER_NUMBER

会引发同样的错误,因为ORDER_NUMBER 存在于两个表中,但在 SELECT 语句的字段列表中没有使用o.d. 限定。如果没有看到生成的查询和您的表定义,我无法准确说出问题所在,但它与此类似。

【讨论】:

以上是关于django 2.1 上的 select_related 不工作的主要内容,如果未能解决你的问题,请参考以下文章

新鲜的 python 3.7 / django 2.2.1 安装无法识别已安装 mysqlclient

鹡鸰 2.0 安装错误

Django 2.1 通过LDAP 调用 FreeIPA账户信息 例子

升级到 2.1 后 Django 管理员无法登录

django 2.1 配sql server 2008求高手指点,,,,,,

激活用户Django 2.1