Лучший способ обновить мою модель django из внешнего источника API? - PullRequest
0 голосов
/ 14 ноября 2018

Я получаю свои данные, запрашивая источник API, затем помещаю их в свою модель django.Тем не менее, данные обновляются ежедневно ... так как я могу обновлять эти данные, не обрабатывая их каждый раз?

def index (request):
    session = requests.Session()
    df = session.get('https://api.coincap.io/v2/assets')
    response= df.json()
    coin = response['data']
    final_result = coin.to_dict('records')
    for coin in final_result:
        obj, created = Coincap.objects.update_or_create(
            symbol = coin['symbol'],
            name = coin['name'],
            defaults = {
                'price': coin['priceUsd']
                })
    return render(request, '/home.html/')

Сейчас мне нужно перейти на /home.html, если я хочу обновить данные.Однако моя цель - позже сериализовать его и сделать его REST API-данными, чтобы я больше не трогал шаблон django.Во всяком случае, для его внутреннего обновления один раз в день после того, как я manage.py runserver?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Для тех, кто ищет пример:

from django.core.management.base import BaseCommand
class Command(BaseCommand):
    def handle(self,*args,**kwargs):
        //Your request api here
        for coin in final_result:
            obj, created = Coincap.objects.update_or_create(
                symbol = coin['symbol'],
                name = coin['name'],
                defaults = {
                    'price': coin['priceUsd']})

Тогда вы сталкиваетесь с cron, как предложил Никита.

0 голосов
/ 14 ноября 2018

Одним из простых и распространенных решений является создание пользовательской команды администратора Django и использование Cron для запуска ее через указанные интервалы. Вы можете написать код команды по своему вкусу, и он может иметь доступ ко всем моделям, настройкам и другим частям вашего проекта Django.

Вы поместили бы свой код, делая запрос и записывая данные в БД, используя ваши модели Django, в новый метод handle() класса Command (очевидно, что параметр request больше не нужен). И затем, если, например, вы назвали свою команду update_some_data, вы можете запустить ее как python manage.py update_some_data.

Предполагается, что Cron существует и работает на машине. Затем вы можете настроить Cron для запуска этой команды через определенные промежутки времени, например, создать файл /etc/cron.d/your_app_name и поместить

0 4 * * * www-data /usr/local/bin/python /path/to/your/manage.py update_some_data >> /var/log/update_some_data.log  2>&1

Это сделает ваше обновление ежедневным в 04:00. Если ваша команда выдаст какой-либо вывод, он будет записан в файл /var/log/update_some_data.log. Конечно, это всего лишь пример, поэтому пользователь вашего сервера, на котором выполняется ваше приложение (www-data здесь) и путь к исполняемому файлу Python на сервере (/usr/local/bin/python здесь) должны быть скорректированы для конкретного использования.

См. Ссылки для получения дальнейших указаний.

...