Skip to main content
 首页 » 编程设计

python之Django related_table() 与 extra()

2024年08月29日31开发

我正在尝试将 .extra() 函数与 .related_table() 一起使用:

foo_objects = Foo.objects.all() 
result = foo.extra(select={'is_ok':'IF(bar.is_ok,"Yes","No")'}).select_related('bar') 

Foo 和 Bar 与模型和所有内容相连(Foo 具有 bar_id),
但在调用 result.values() 时,我不断收到“'field list' 中的未知列'bar.is_ok'”,
查看生成的查询(生成的实际查询,而不是 foo.query),它不会
似乎加入了两者,关于我如何做到这一点有什么想法吗?

请您参考如下方法:

下面的查询应该可以工作,但我无法真正测试它...

foo_objects = Foo.objects.select_related('bar').extra(select={'is_ok':'IF(bar.is_ok,"Yes","No")'}) 

执行 select_related() 的顺序并不重要和 extra() in,只要它们都在同一个查询集上。


更新

如果您需要它来处理 ValuesQuerySet , 你不能使用 select_related() , 所以你必须稍微不同地做,通过对 extra() 使用额外的参数...

foo_objects = Foo.objects.extra(tables=('bar',), 
                                where=('foo.bar_id=bar.id',), 
                                select={'is_ok':'IF(bar.is_ok,"Yes","No")'}).values() 

...或者如果您不需要返回"is"和“否”,您可以使用...

foo_objects = Foo.objects.values('bar__is_ok') 

...这将强制加入。

另见 Django 票证 #3358 .