5

我的项目是围绕发出 API 请求(获取 JSON)和从这些请求中输出信息而构建的。60-80% 的请求都在请求很少更改的静态数据。我想将这些静态数据存储在数据库中,这样我就不必将所有请求都花在该静态数据上。

我已经建立了一个模型,它将保存来自其中一个请求的所有信息。我不知道在哪里放置任何代码,以便用我的请求中的信息实际填写该数据库。

模型

 class Champion(models.Model):
     id = models.IntegerField(primary_key=True)
     name = models.CharField(max_length=100)
     title = models.CharField(max_length=255)
     image = models.CharField(max_length=5000)
     ...

基本上我知道我需要发出 2 个请求,一个是获取我所有的 id,然后遍历这些 id 并发出一个请求,该请求将在数据库中创建一个 Champion。我已经为此编写了代码,我只是不知道该代码放在哪里或如何访问它。

4

2 回答 2

5

所以换句话说 - 你有一些远程 API 和本地 django 驱动的站点。您不想在每个请求中从远程 API 获取数据,因此您希望将其存储在本地。在这种情况下,您需要将您的数据与远程数据同步,问题是:如何开始同步。

您有一些可能性,但首先您应该考虑何时运行同步:

  • 每天/每小时/每周/每月?
  • 手动/按要求?
  • 何时更改数据(远程 API 上的某些方法,检查上次修改)?

如果你想在数据发生变化或数据经过一段时间后进行同步,你需要再回答一个问题:你的同步应该如何影响请求?如果可以在请求期间处理同步,或者在同步期间调用的请求仍然返回旧数据是否可以?

如果您决定根据请求同步它 - 您可以简单地将同步代码放入自定义管理命令中或放入将运行同步的单独视图(仅限授权访问)中。

如果可以在正常请求期间进行同步,您可以检查每个请求,如果上次同步的时间超过 X,远程 API 上的数据是否更新或满足其他条件,然后在返回响应之前运行同步(注意比赛条件!)。

如果您不想在请求期间执行此操作(并且在同步发生时发出的请求仍然返回旧数据也没关系),您可以使用 celery 或系统 cron 作业。

Celery 可以按需运行任务(例如在请求中,当您检查远程数据是否更改时,您可以运行异步任务来进行同步并根据旧数据返回响应)或定期运行任务(如 cron 作业)。对于正常的 cron 任务,您可以使用自定义管理命令,如上所述。

于 2015-08-21T12:22:04.410 回答
2

在您的项目目录中创建一个 python 文件并包含以下代码。要运行这个 python 脚本,你只需要从你的终端说 python filename.py。干杯!

import os
import django

logger = logging.getLogger(__name__)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")

django.setup()

from your_app_name import models

for champ in Champion.objects.all():
    try:
        #make your API request here
        #suppose champ_image is what you retrieve from the API
        champ.image = champ_image
        champ.save()
        print "updated:"+champ.name
    except:
        print "could not save:"+champ.name
print "Action complete!"
于 2015-08-21T12:37:54.803 回答