gpt4 book ai didi

python - Django 模型 : Keep track of activity through related models?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:49:39 24 4
gpt4 key购买 nike

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

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

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

我的第一个想法是向“事件”模型添加一个 post_save Hook 。看起来仍然是我最好的选择,但我对它们一无所知,它们对数据库的影响有多大,等等。

我的第二个想法是编写某种脚本来处理当天的事件并在夜间更新这些模型。不过,我的雇主是一个“直播”者。

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

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

最佳答案

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

首先,让我们添加一个方法来更新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 秒或每分钟更新一次数据库。使用此技术,您可能会找到良好的性能/更新性权衡。

虽然这些只是基于您提出的一些建议,但正确的选择取决于您拥有的数据类型。确定您将拥有什么样的负载,该领域需要什么样的 react 时间,然后进行实验。

关于python - Django 模型 : Keep track of activity through related models?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10982591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com