【问题标题】:Django Models: Keep track of activity through related models?Django 模型:通过相关模型跟踪活动?
【发布时间】:2012-06-11 14:56:25
【问题描述】:

我有一个人的主表。我的 Django 应用程序中的所有内容都与一个或多个人直接或通过长 fk 链相关。此外,我所有的模型都有标准的簿记字段“created_at”和“updated_at”。我想在我的 Person 表上添加一个名为“last_active_at”的字段,主要用于原始 sql 排序目的。

创建或编辑某些相关模型会为这些对象生成新的时间戳。我需要以某种方式用这些值更新 Person.'last_active_at' 。从功能上讲,这并不难实现,但我担心应用程序会承受过大的压力。

我最担心的两个原因是我被限制在一个真正的数据库字段中——我不能将函数分配给 Person 表作为 @property——并且这些“活动”模型之一接收和处理来自我无法控制的外部数据源的新实例,偶尔会一次接收大量数据。

我的第一个想法是在“活动”模型中添加一个 post_save 挂钩。似乎仍然是我最好的选择,但我对它们一无所知,它们对数据库的影响有多大,等等。

我的第二个想法是编写某种脚本,通过一天的活动并在晚上更新这些模型。不过,我的雇主是“现场直播”。

我的第三个想法是修改 post_save 算法以检查“updated_at”是否距离 Person 的“last_active_at”不到半小时,如果为真则不更新该人。

我的想法是否朝着可扩展的方向发展?我还应该采用其他方法吗?

【问题讨论】:

    标签: python django performance algorithm model


    【解决方案1】:

    据说过早优化是所有问题之母。您应该从最愚蠢的实现开始(每次都更新它),然后测量并 - 如果需要 - 用更有效的方法替换它。

    首先,让我们放置一个方法来更新Person 上的last_active_at 字段。这样一来,所有的更新逻辑本身都集中在这里,我们以后可以轻松修改。

    信号很容易使用:它只是声明一个函数并将其注册为接收器,每次发出信号时都会运行它。有关完整说明,请参阅 the documentation,但它可能看起来像这样:

    from django.db.models.signals import post_save
    from django.dispatch import receiver
    
    @receiver(post_save, sender=RelatedModel)
    def my_handler(sender, **kwargs):
        # sender is the object being saved
        person = # Person to be updated
        person.update_activity()
    

    至于更新本身,从最愚蠢的方式开始。

    def update_activity(self):
        self.last_active_at = now()
    

    然后衡量并确定是否存在问题。如果这是一个问题,您可以做的一些事情是:

    • 在再次更新之前检查之前的更新是否是最近的。如果对您的数据库的读取不比写入快,则可能没用。如果您使用缓存,这不是问题。
    • 把它写下来,以便延迟进程稍后更新。不需要每天:如果问题是您每秒有 100 次更新,您可以让脚本每 10 秒或每分钟更新一次数据库。使用这种技术,您可能会找到良好的性能/更新性权衡。

    这些只是基于您提出的一些建议,但正确的选择取决于您拥有的数字类型。确定您将承受什么样的负荷,该领域需要什么样的反应时间,并进行实验。

    【讨论】:

    • 正在运行 memcached... 需要 appx 半小时的反应时间... 听起来我需要推动并获得负载!谢谢。
    • 您可以轻松地使用docs.djangoproject.com/en/1.2/faq/models/… 来衡量您的查询所花费的时间。对于更高级的分析,django-profiling 看起来是一个不错的工具,但可能还有其他工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2021-09-04
    • 1970-01-01
    • 2020-01-19
    • 2020-12-21
    • 2020-05-25
    相关资源
    最近更新 更多