2013-07-20 125 views
1

我有一个Document模型,它与User有多对多的“收藏夹”关系。当我在搜索页面上显示文档列表时,我想显示每个文档是否为当前用户的最爱。我知道这样做的两种方式,一种更有效,一种更清洁。我想知道是否有另一种方式可以做到这一点,这样既高效又干净。在Django模板中查询M2M关系

  1. 干净的版本。只需在模型“is_favored(user)”上有一个方法,告诉文档是否受到给定用户的青睐。然后有一个简单的模板标签,使用这个函数来显示一个空的星形或一个填充的星形。当然,这样做效率不高,因为它会为每个文档创建不同的数据库调用。但这很好,因为视图不需要以任何方式改变。

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

有没有更好的方法既干爽又高效? 谢谢。

回答

1

上下文处理器是你在找什么。

在这里你可以读到它:http://www.djangobook.com/en/2.0/chapter09.html(看看的RequestContext和Context处理器部分)


编辑:

你也可以简单地创建一个函数,用户和列表当前显示在搜索结果中的文档。这样的事情:

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的文件是最喜欢或不喜欢。 然后在每个视图中调用该函数并使用其结果。

现在(如果你想改变属性的“收藏夹” FE的名字你要做的只有一个变化引起。

+0

我不认为我能有机会到我传递的文档是DRY模板在上下文处理器中。为了在每个文档中添加一个“最喜欢的”变量,我需要它。 –