我尝试使用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。 谁能帮我弄清楚我做错了什么?
答案 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')...