使用来自 API 获取请求的数据填充 Django 数据库
Populate Django Database with data from API Get request
我的项目是围绕发出 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 的请求。我已经为此编写了代码,只是不知道将此代码放在哪里或如何访问它。
换句话说 - 你有一些远程 API 和本地 django 支持的站点。您不想在每个请求中从远程 API 获取数据,因此您希望将其存储在本地。那样的话,你就需要同步你的数据和远程数据了,问题是:如何开始同步。
你有一些可能性,但首先你应该考虑什么时候你想要运行同步:
- daily/hourly/weekly/monthly?
- 按hand/on要求?
- 何时更改数据(远程 API 上的某些方法,检查最后修改)?
如果你想在数据发生变化时或者一段时间后同步,你还需要回答一个问题:你的同步应该如何影响请求?如果在请求期间处理同步没问题,或者如果在同步期间调用的请求仍然是 returning 旧数据没问题?
如果您决定根据请求同步它 - 您可以简单地将同步代码放入 custom management command 或放入单独的视图(仅限授权访问),这将 运行 同步。
如果可以在正常请求期间进行同步,您可以检查每个请求是否距离上次同步时间超过 X,远程 API 上的数据是否已更新,或者是否满足其他条件,并且只是运行 在 return 响应之前进行同步(注意竞争条件!)。
如果您不想在请求期间执行此操作(在同步发生时发出的请求仍然是 returning 旧数据也没关系),您可以使用 celery 或系统 cron 作业。
Celery 可以 运行 按需执行任务(例如在请求中,当您检查远程数据是否已更改时,您可以 运行 异步任务来执行同步 return 基于旧数据的响应)或 运行 定期执行任务(如 cron 作业)。对于普通的 cron 任务,您可以使用自定义管理命令,如上所述。
在您的项目目录中创建一个 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!"
我的项目是围绕发出 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 的请求。我已经为此编写了代码,只是不知道将此代码放在哪里或如何访问它。
换句话说 - 你有一些远程 API 和本地 django 支持的站点。您不想在每个请求中从远程 API 获取数据,因此您希望将其存储在本地。那样的话,你就需要同步你的数据和远程数据了,问题是:如何开始同步。
你有一些可能性,但首先你应该考虑什么时候你想要运行同步:
- daily/hourly/weekly/monthly?
- 按hand/on要求?
- 何时更改数据(远程 API 上的某些方法,检查最后修改)?
如果你想在数据发生变化时或者一段时间后同步,你还需要回答一个问题:你的同步应该如何影响请求?如果在请求期间处理同步没问题,或者如果在同步期间调用的请求仍然是 returning 旧数据没问题?
如果您决定根据请求同步它 - 您可以简单地将同步代码放入 custom management command 或放入单独的视图(仅限授权访问),这将 运行 同步。
如果可以在正常请求期间进行同步,您可以检查每个请求是否距离上次同步时间超过 X,远程 API 上的数据是否已更新,或者是否满足其他条件,并且只是运行 在 return 响应之前进行同步(注意竞争条件!)。
如果您不想在请求期间执行此操作(在同步发生时发出的请求仍然是 returning 旧数据也没关系),您可以使用 celery 或系统 cron 作业。
Celery 可以 运行 按需执行任务(例如在请求中,当您检查远程数据是否已更改时,您可以 运行 异步任务来执行同步 return 基于旧数据的响应)或 运行 定期执行任务(如 cron 作业)。对于普通的 cron 任务,您可以使用自定义管理命令,如上所述。
在您的项目目录中创建一个 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!"