Администратор Django, использующий RESTful API против базы данных - PullRequest
11 голосов
/ 26 января 2012

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

Само по себе это не проблема.Проблема в том, что все решили, что лучше всего, если бы администратором центра был клиент, который находится на вершине платформы RESTful.

Итак, мой вопрос, есть ли способ манипулировать уровнем моделиDjango для доступа к нашему API напрямую, а не напрямую с базой данных?Слой модели будет выступать в роли клиента, передающего запросы и ответы в и из центра администрирования.

Я уверен, что это возможно, но я не уверен в том, с чего начать.Любой вход?

1 Ответ

3 голосов
/ 15 июля 2016

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

Если бы мне пришлось сделать это еще раз, мне потребовалось бы много времени, чтобы рассмотреть альтернативы. И если это действительно звучит как лучшая вещь, я бы, вероятно, создал пользовательский бэкэнд базы данных. Этот бэкэнд вместо преобразования запросов Django ORM в запросы SQL преобразует их в запросы HTTP.

Для этого, я думаю, лучше всего начать знакомство с исходным кодом django, касающимся бэкэндов базы данных .

Я также думаю, что есть несколько важных вещей, которые следует учитывать перед началом такой разработки:

  • Может ли API обработать любой запрос Django ORM? Другими словами, будет ли любой запрос Django ORM переводиться на запрос API?
  • Если нет, могут ли "непереводимые" запросы безопасно игнорироваться? Например, ORDER BY предложение может безопасно игнорировать. В то время как пункт GROUP BY вряд ли будет безопасно отклонен.
  • Если некоторые запросы не могут быть ни переведены, ни проигнорированы, могут ли они быть разумно эмулированными. Например, если ваш API не поддерживает операцию COUNT(), вы можете эмулировать ее, получая все данные и считая их в python с len(), но разумно ли это?
  • Если это все еще некоторые запросы, которые вы не сможете обработать (что более чем вероятно): все ли «общие» запросы (в данном случае, все запросы, потенциально используемые администратором Django) покрыты и будут ли они Можно ли обновить API, если в последнее время обнаружен открытый случай или он появится в будущей версии Django?

В зависимости от варианта использования, вероятно, есть множество других соображений, таких как:

  • целостность данных
  • сопровождение транзакций
  • время запроса, которое, вероятно, будет намного выше, чем просто запрос локальной (или даже удаленной) базы данных.
...