【问题标题】:Using extra() with foreign key on django model fails with DB error在 django 模型上使用带有外键的 extra() 失败并出现 DB 错误
【发布时间】:2014-07-13 06:46:40
【问题描述】:

我正在尝试使用 django 的 extra() 方法将外键字段添加到查询集中,但我得到了数据库错误。我想知道我做错了什么。这是我的设置:

class ModelA(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    name = models.CharField(max_length=100)

class ModelB(models.Model):
    name = models.CharField(max_length=100)
    rel = models.ForeignKey(ModelA)

我正在尝试使用 extra() 从相关模型中添加一个字段,以便我可以使用它进行 annotate()。 这是我想要做的:

ModelB.objects.all().extra(select={'date' : 'date(rel.created)'}).values('date').annotate(...)

这给了我一个数据库错误,说“rel”列不存在。

我正在使用 PostgreSQL。 谁能帮我弄清楚我做错了什么?

【问题讨论】:

    标签: sql database django django-models


    【解决方案1】:

    使用extra() 时,您正在显式编写 SQL 代码。在后端,rel 实际上保存为rel_id,每一行都是 ModelA 的一个 pk——这就是为什么你会得到列“rel”不存在

    您需要用正确的 sql 重写您的 extra(select={})

    ModelB.objects.all().extra(
        select={'date': '''SELECT created
                           FROM appname_modela
                           WHERE appname_modela.id = appname_modelb.rel_id'''})
    

    但是,正如@Daniel Roseman 所说,您的问题根本不需要使用extra(),在这种情况下我强烈建议不要使用它。

    【讨论】:

      【解决方案2】:

      嗯,它不存在:另一个表叫做model_a

      但这里没有理由使用extra。您可以通过values 调用获取该列:

      ModelB.objects.all().values('rel__created')...
      

      【讨论】:

      • 感谢您的回答。尽管您是正确的,我不需要 extra() 来获取信息,但我试图使用它将 datetime 字段格式化为仅日期(使用数据库的 date() 函数)以便我执行注释()。如果我不使用它,我在查询集中得到的每个值在时间戳上都略有不同,因此 annotate() 中的计数方法不会给我想要的结果
      猜你喜欢
      • 1970-01-01
      • 2021-03-31
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多