1

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

  1. 干净的版本。只需在模型“is_favored(user)”上设置一个方法,该方法可以判断文档是否受到给定用户的青睐。然后有一个简单的模板标签,它使用这个功能来显示一个空的星形或一个填充的星形。当然这效率不高,因为它会对每个文档进行不同的数据库调用。但这很好,因为不必以任何方式更改视图。

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

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

4

1 回答 1

1

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

在这里您可以阅读:http: //www.djangobook.com/en/2.0/chapter09.html(查看RequestContext 和上下文处理器部分)


编辑:

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

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 (因为如果你想更改属性“收藏夹”的名称,你只需要做一次更改。

于 2013-07-20T15:29:18.140 回答