查询Django模板中的M2M关系

时间:2013-07-20 11:30:05

标签: django django-templates

我有一个Document模型,它与User有很多“最爱”关系。当我在搜索页面上显示文档列表时,我想显示每个文档是否是当前用户的最爱。我知道有两种方法可以做到这一点,一种更有效,一种更清洁。我想知道是否有其他方法可以做到这一点,以便它既高效又干净。

  1. 清洁版。只需在模型“is_favored(user)”上有一个方法,它告诉文档是否受给定用户的青睐。然后有一个简单的模板标签,使用此功能显示空星或填充星。当然这不高效,因为它会为每个文档进行不同的DB调用。但这很好,因为视图不必以任何方式改变。

  2. 高效版。在视图中执行单个数据库查询以检索收藏查询并在每个文档上添加“favored”字段。我不喜欢这种方法,因为我必须将自定义代码添加到显示文档的所有视图中,并且它不会太干。

  3. 是否有更好的方法既干又有效? 谢谢。

1 个答案:

答案 0 :(得分:1)

上下文处理器是您正在寻找的。

在这里你可以阅读它:http://www.djangobook.com/en/2.0/chapter09.html(查看 RequestContext和Context Processors 部分)


修改

您还可以简单地创建一个功能,该功能可以获取当前在搜索结果中显示的用户和文档列表。像这样:

def favs(user, docs):
    l = user.favorites.filter(pk__in=docs).values_list('pk', flat=True)
    return dict( (k, (k in l)) for k in docs )

所以现在,我们有字典,说明给定id的文件是否是最喜欢的。 然后在每个视图中调用该函数并使用其结果。

现在是DRY(因为如果你想改变属性“收藏夹”的f.e.名称,你只需做一次更改。