Я помню, я когда-то думал о такой вещи. В то время я создал собственный менеджер, используя собственный 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?
В зависимости от варианта использования, вероятно, есть множество других соображений, таких как:
- целостность данных
- сопровождение транзакций
- время запроса, которое, вероятно, будет намного выше, чем просто запрос локальной (или даже удаленной) базы данных.