【问题标题】:Django Contenttypes and decoratorDjango 内容类型和装饰器
【发布时间】:2010-10-29 01:59:36
【问题描述】:

该站点使用 2 个对象 - 文章和博客。每次查看文章或博客时,相关计数器应增加一。

这个想法是有一个“前十”的应用程序来衡量文章和条目的“流行度”。

因为我使用了多个对象,所以我希望 Tracker 模型对相关对象使用 genericForeignKey。

#models.py
class Tracker(models.Model):
    count = models.PositiveIntegerField(default=1)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    def hit(self):
        self.count += 1

我想写一个包装视图函数的装饰器,但可能没有必要。

谢谢

【问题讨论】:

    标签: django django-models content-type decorator


    【解决方案1】:

    如果我理解正确,您想计算每个对象的每个实例化。我会使用 post_init signal 来做到这一点——如果你不介意它不是装饰器的话。

    这是我写的代码 - 使用 post_save 而不是 post_init:

    def thumb_init(sender, **kwargs):
        kwargs['instance'].process()
        kwargs['instance'].make_thumbnail()
    
    post_init.connect(thumb_init, sender=Thumbnail) 
    post_init.connect(thumb_init, sender=<otherModel here>)  
    

    【讨论】:

    • 所以每当数据库遇到对象查询时都会发送 post_init 信号?通过使用计数器监听和响应信号,我们可以计算特定“实例”在视图中被实例化的次数。太棒了!
    • 这不是解决方案,但关闭:每次在管理员中发生实例化时都会发送 post_init 信号;我只需要跟踪用户视图。我会尝试制作一个自定义信号。
    • 在您的视图中,您可以通过像 obj.touched = True 这样的猴子补丁将对象标记为被视图触摸。在一个信号中你会检查它(并且应该再次删除它)
    猜你喜欢
    • 2011-12-24
    • 2012-04-20
    • 2011-12-15
    • 2019-10-23
    • 2015-11-18
    • 2021-09-27
    • 2014-02-24
    • 2010-12-15
    • 2019-04-30
    相关资源
    最近更新 更多