Сохранение и обновление запроса API как модели Django?

В настоящее время я возился со Steam API, чтобы получить информацию об игроке, игровой инвентарь и т. Д. У меня небольшие трудности с попыткой найти решение, как сохранить очень дорогой запрос API.

Я получаю всю схему предметов для конкретной игры (DOTA2), используя

http://api.steampowered.com/IEconItems_570/GetSchema/v0001/

Это очень дорогой запрос, и поэтому мне нужно сохранить его в базе данных, чтобы получить информацию об элементе, относящемся к инвентарю конкретного пользователя.

У меня есть ряд вопросов:

  1. Как сохранить всю эту информацию в базе данных? Нужно ли вручную создавать модель, а затем фильтровать и сохранять данные? Если да, то как мне это сделать? (Т.е. я бы сделал это на уровне модели в models.py или сделал бы это в представлении?)

  2. Далее, как я могу обновить любые изменения, внесенные в схему элемента при обновлении?

  3. Как мне создать сценарий, который я могу запускать только при необходимости для обновления базы данных в случае Q2 выше. Один из способов, который я могу придумать, - это настроить URL-адрес, который при посещении инициирует обновление, но я не уверен, что это лучший вариант.

Спасибо!


person Deep    schedule 21.07.2014    source источник


Ответы (2)


Ваш вопрос действительно большой. Во-первых, вам нужно установить информацию о вашей базе данных в settings.py, чтобы сохранить всю информацию в базе данных. Вы должны установить поле в models.py, чтобы восстановить все значения в базе данных. Например,

...
name = models.CharField(max_length=20,blank=True,verbose_name='your name')
...

Во-вторых, когда есть обновление, есть запрос. Как только вы получите этот запрос, вы можете проанализировать его, а затем сохранить в базе данных. Это можно сделать прямо там, где вы получаете запрос на обновление. В-третьих, я думаю, что есть два пути. Один из них, как вы сказали, использует URL. Другой вызывает функцию обновления напрямую. Это питон, да? Вы можете вызывать любую функцию по своему усмотрению.

Надеюсь, поможет.

person Stephen Lin    schedule 21.07.2014

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

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

Если вам нужны исторические данные, то необходимо выполнить синтаксический анализ ответа. Вам придется смоделировать всю схему и проставить дату для значений в вашей системе. Каждый раз, когда вы проверяете наличие обновлений, вам придется добавлять новую запись в вашу систему. Подавляющее большинство схем не меняется между обновлениями. Вы обнаружите, что многие данные дублируются, если вы не обрабатываете неизмененные данные (т. е. качества, имена происхождения, уровни элементов и большинство самих элементов не будут затронуты каким-либо данным обновлением).

Ваше предложение для варианта 3 является правильной идеей, хотя оно требует ручного посещения кем-то (предположительно, вами). Хотя, наверное, это проще всего реализовать.

person Andy♦    schedule 21.07.2014