我的项目是围绕发出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。我已经编写了用于执行此操作的代码,我只是不知道在何处放置此代码或如何访问它。
答案 0 :(得分:5)
换句话说 - 你有一些远程API和本地django支持的站点。您不希望在每个请求中从远程API获取数据,因此您希望将其存储在本地。在这种情况下,您需要将数据与远程数据同步,问题是:如何开始同步。
您有一些可能性,但首先您应该考虑何时需要运行同步:
如果要在数据更改时或在一段时间的数据之后进行同步,则需要回答另一个问题:同步如何影响请求?如果可以在请求期间处理同步,或者如果在同步期间调用的请求仍在返回旧数据时可以正常吗?
如果您决定根据请求同步它 - 您只需将同步代码放在custom management command内或放入将运行同步的单独视图(仅限授权访问)。
如果在正常请求期间可以进行同步,则可以检查每个请求中上次同步的时间是否大于X,远程API上的数据是否已更新或是否满足其他条件并且只是运行同步在回复之前(注意竞争条件!)。
如果您不想在请求期间执行此操作(并且在发生同步时发出的请求仍然可以返回旧数据),则可以使用celery或system cron jobs。
Celery可以按需运行任务(例如,在请求中,当您检查远程数据是否已更改,您可以运行异步任务以执行同步并根据旧数据返回响应)或定期运行任务(像cron jobs)。对于普通的cron任务,您可以使用自定义管理命令,如上所述。
答案 1 :(得分: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!"