如何在Django中保留单个值?

时间:2009-07-09 20:10:01

标签: django

我的Django应用程序每天都会检索RSS提要。我想坚持在应用程序的某个地方最后更新Feed的时间。我只检索一个Feed,它永远不会成长为多个Feed。我怎样才能坚持上次更新的时间?

到目前为止我的想法

  1. 创建模型并向其添加日期时间字段。这似乎有点过分,因为它向数据库添加了另一个表,其中只有一行。除此之外,它是最明显和最直接的解决方案。

  2. 创建一个只存储键/值映射的设置对象。最后更新的日期只是该数据库中的行。这基本上是以前解决方案的通用版本。

  3. 使用dbsettings/django-values,它允许您在数据库中存储设置。最后更新的日期只是一个“设置”。

  4. 我缺少的任何其他想法?

7 个答案:

答案 0 :(得分:6)

尽管数据库在任何给定的表中定期存储许多行,但只要没有(m)任何索引就会浪费空间,因此只有一行只有一行表并不是特别昂贵。实际上,大多数数据库创建许多单行表来实现某些功能,例如用于生成主键的单调序列。我鼓励你为此创建一个常规模型。

答案 1 :(得分:2)

  1. RAM volatile ,因此持久性:memcached不是您要求的。
  2. XML 是存储单个值的正确技术。
  3. RDMS 是存储单个值的正确技术。
  4. 如果CACHE_BACKEND设置为 file:// ...
  5. 以外的其他任何内容,Django缓存框架将回答您的问题

    文件系统 是“持久保存单个值”的正确技术。

    在settings.py中:

     RSS_FETCH_DATETIME_PATH=os.path.join(
         os.path.abspath(os.path.dirname(__file__)),
         'rss_fetch_datetime'
     )
    

    在你的rss fetch脚本中:

     from django.conf import settings
     handler = open(RSS_FETCH_DATETIME_PATH, 'w+')
     handler.write(int(time.time()))
     handler.close()
    

    无论您何时需要阅读它:

     from django.conf import settings
     handler = open(RSS_FETCH_DATETIME_PATH, 'r+')
     timestamp = int(handler.read())
     handler.close()
    

    但是如果你想“每天都运行命令”,例如凌晨5点,cron 正确的工具:

     0 5 * * * /path/to/manage.py runscript /path/to/retreive/script
    

    当然,您仍然可以在retreive脚本末尾的文件中写入最后一个更新时间戳,并在其他地方使用它,如果这对您有意义的话。

    总结引用肯汤普森:

      

    我最富有成效的一天是   扔掉1000行代码。

答案 2 :(得分:1)

我过去使用的一个解决方案是使用Django的缓存功能。您将值设置为True且过期时间为一天(在您的情况下。)如果未设置该值,则您将获取Feed,否则您将不执行任何操作。

您可以在此处查看我的解决方案:Importing your Flickr photos with Django

答案 3 :(得分:0)

如果您只需要用于缓存目的,为什么不将它存储在memcached中?

另一方面,如果您将此数据用于其他目的(例如在页面上显示,或进行一些计算等),那么我会将其存储在新模型中 - 在Django中,所有持久性都是建立在数据库之上,通过模型,我不会尝试使用其他“聪明”的解决方案。

答案 4 :(得分:0)

我在使用PHP时常常做的一件事就是将xml存储在某处,但插入了一个新标签来保存最新检索的时间戳。它不是很好,但它快速而简单。

答案 5 :(得分:0)

保持简单会导致将其存储在文件系统中的想法......为什么你不能这样做?例如,您可以在其中一个应用程序中拥有siteconfig模块,其中包含这些类型的数据。这可以加载来自特定文件的数据,该文件可以是文本,JSON,ConfigParser,pickle或任何合适的格式。只需import siteconfig某个地方,它就可以加载数据并使其可供您网站中的其他模块使用。您可以轻松地扩展它以保存具有多个设置的类似dict的对象(例如,如果您有多个源,但不希望只有2-3行的模型,您可以轻松地保持最后一个 - 检索由Feed网址键入的dict中每个Feed的时间。

答案 6 :(得分:0)

创建一个会话密钥,该密钥会永久存在,并在每次访问时更新Feed时间戳。