我有一对带外键的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}}引用,我不知道如何命名“*设置“谷歌的东西。关于如何谷歌这一点的提示也会有所帮助。
答案 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作为字典元素传递给视图函数,以查看是否得到相同的结果。