在django模型上使用带有外键的extra()会因DB错误而失败

时间:2014-05-23 19:35:35

标签: sql database django django-models

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

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()从相关模型中添加一个字段,以便我可以用它来注释()。 这就是我要做的事情:

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

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

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

2 个答案:

答案 0 :(得分:3)

使用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(),在这种情况下我强烈反对它。

答案 1 :(得分:0)

嗯,它不存在:另一个表名为model_a

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

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