在模板中反转django-fts可搜索模型的外键

时间:2009-07-17 10:06:03

标签: django sqlite postgresql django-templates psycopg2

我有一对带外键的Django模型,其中一个可以用django-fts搜索,比如说:

class Foo(models.Model):
    ...
class Bar(fts.SearchableModel):
    foo = models.ForeignKey(Foo)

当我有一个Foo实例时,在视图中我可以插入print foo.bar_set.all()并看到一系列结果。但是,如果我尝试在视图中使用它,可以采用以下任何一种方式:

{{foo.bar_set|pprint}}
{{foo.bar_set.all|ppring}}
{{foo.bar_set.count}}
{{foo.bar_set.all|length}}
{% for bar in foo.bar_set.all %} {{bar}} {% endfor %}

和字面意思任何构造,我认为它的行为就像foo实例没有bar_set属性一样。

编辑:我确信我在模板中有一个Foo个实例,我按照预期的方式进行了测试:

{{foo|pprint}}
{{foo.id}} (and any other simple attributes of Foo)

我确定有相关的Bar对象,因为我从视图(print foo.bar_set.all())中检查了它。如果QuerySet为空,{{foo.bar_set.all|pprint}}将产生[],而不是''(它在{{foo.bar_set.all|pprint}}{{foo.bar_set|pprint}}以及任何{{foo.nonexistent_attribute|pprint}}上产生django.core.urlresolvers.reverse )。

当我使用psycopg2驱动程序将开发从SQLite数据库移动到PostgreSQL以使用django-fts全文搜索时,就会出现这种情况。

我找不到任何其他答案,因为谷歌搜索这是非常困难的:“反向关系”或“反向外键”都散落着无关的{{1}}引用,我不知道如何命名“*设置“谷歌的东西。关于如何谷歌这一点的提示也会有所帮助。

3 个答案:

答案 0 :(得分:2)

感谢Marcin Kaszyński的帮助,我设法将错误追溯到django-fts BaseManager。 Django-fts是一个全文搜索引擎,它将.search(query)方法添加到可搜索类的管理器中,我可以编写Foo.objects.search("bar")。对于便利性,它会向管理器添加__call__方法,该方法由RelatedManager继承(其实例为bar_set)。

django.templates.Variable._resolve_lookup方法中的模板代码看到bar_set可调用(第717行),尝试不带参数调用它(第722行),并将变量视为空,因为参数是要求(第724-726行)。

Removing the __call__ method from django-fts' BaseManager有帮助。

答案 1 :(得分:0)

{{ foo.bar_set.all }}一定能奏效。你确定你真的有一个Foo的实例吗?

答案 2 :(得分:0)

我建议在渲染页面之前尝试将foo.bar_set.all作为字典元素传递给视图函数,以查看是否得到相同的结果。