【问题标题】:Django 1.11 How to execute a code only once that save a data to DB using Django modelDjango 1.11 如何只执行一次代码,使用 Django 模型将数据保存到数据库
【发布时间】:2019-01-25 06:19:14
【问题描述】:

我开始使用 Django Rest Framework,我的应用基于 Django 1.11 版本。

我有一个型号名称 Test。 现在我只需要在应用程序启动时填充这个模型一次,这将接收来自 REST API 调用的数据。我阅读了有关 app.ready() 的信息,但我不知道如何连接这些步骤。

所以基本上是在应用启动时:

  1. 检查表A中是否存在一些数据,最好调用objects.count()。

  2. 如果是,则什么也不做。

  3. 如果没有,调用第三方API并保存模型。

这也可以在管理员上完成?

【问题讨论】:

  • “应用程序启动时”到底是什么意思?
  • 我的意思是我的模型只需要填充一次,因此管理员可以访问该数据,因为我已经删除了添加权限。
  • @ruddra 的回答很好。您可以创建一个自定义命令,该命令应该是幂等的,即仅当条目不存在时才创建它们。因此,无论您多久运行一次命令,条目都不会重复。另一种方法是使用fixtures 作为初始数据,或者在迁移中包含初始数据。

标签: python django django-models django-rest-framework


【解决方案1】:

有几种方法可以做到这一点。最干净的方法是像这样create a new custom command

# app/management/commands/updateappdb.py

from django.core.management.base import BaseCommand, CommandError   
from polls.models import Question as Poll

class Command(BaseCommand):
    help = 'Update DB'


    def handle(self, *args, **options):
        # Update code here
        if not YourModel.objects.exists():
           # do something
        self.stdout.write(self.style.SUCCESS('Successfully Updated')

然后你可以使用这个命令例如:

python manage.py updateappdb && python manager.py runserver

还有另一种方法,就是将这些写在urls.py 中。 Urls.py 在服务器启动时加载一次。所以在 urls.py 你可以这样尝试:

from django.confs.urls.defaults import *
from your_file import data_import_function  # which has the data load functionality

urlpatterns = [...]

data_import_function()

但是在这两种方法中,我更喜欢第一种。因为它的可重用性更高,如果您想要定期更新,可以将此自定义命令与 cronjob 集成。

【讨论】:

  • @rudra,如果我采用第二种方法,问题是在进行迁移时会调用 urls.py,而我的函数依赖于仍然不存在的模型,因为它会在我创建时创建将运行迁移。知道如何在部署到服务器时解决这个问题吗?
  • 也许您可以将该函数放在 try catch 块中。你可以这样试试try: ... except ProgrammingError: ...
猜你喜欢
  • 2020-07-11
  • 2016-07-07
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2017-10-11
相关资源
最近更新 更多