Django - 计算模型实例视图(对于“顶部条目”应用程序)
-
23-08-2019 - |
题
我是新人,也很困惑。我想创建一个模块来跟踪文章和博客模型的“热门”实例。我不想触及文章或博客模型的代码。这是中间件的候选者吗?看着 HttpRequest.path
?
解决方案
查看 request.path 的中间件很丑陋,因为它引入了对用于显示文章和博客文章的 URL 模式的详细信息的依赖。如果您不介意这种耦合,那么您不妨保存性能影响并在网络服务器日志文件上进行分析。(编辑: 查看中间件 将是一个更好的选择,因为它为您提供了可调用的视图及其参数。我仍然更喜欢装饰器方法,因为它不会在不相关的视图上产生任何开销,但如果您不想触及博客/文章应用程序的 URLconf,则视图中间件可以工作。
我会使用一个视图装饰器来包裹 object_detail 视图(或您的自定义等效视图)。您可以直接在 URLconf 中进行此包装。像这样的东西:
def count_hits(func):
def decorated(request, *args, **kwargs):
# ... find object and update hit count for it...
return func(request, *args, **kwargs)
return decorated
你可以在views.py中应用它:
@count_hits
def detail_view(...
或者在你的 URLconf 中:
url(r'^/blog/post...', count_hits(detail_view))
其他提示
您可以创建一个通用的命中模型
class Hit(models.Model):
date = models.DateTimeFiles(auto_now=True)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
在你的 view.py 中你编写这个函数:
def render_to_response_hit_count(request,template_path,keys,response):
for key in keys:
for i in response[key]:
Hit(content_object=i).save()
return render_to_response(template_path, response)
以及您感兴趣的回复的观点
return render_to_response_hit_count(request, 'map/list.html',['list',],
{
'list': l,
})
这种方法使您不仅可以计算点击次数,还可以按时间、内容类型等过滤点击历史记录......
由于命中表可能增长很快,您应该考虑删除策略。
不隶属于 StackOverflow