Мне нужно переместить одно из моих Django приложений в микросервис, это приложение «Файлы», в котором есть модели «Файл» и «Папка».
Другие приложения, использующие это приложение, и его модели для прикрепления файлов к в некоторых других моделях, например, у пользователя есть поле «аватар», которое связано с моделью файла, у блога есть поле «папки», которое связано со списком моделей папок и т. д.
Микро сервис будет доступен через REST API и будет иметь методы для запросов к файлам и папкам, достаточно богатым, чтобы удовлетворить все потребности существующего кода.
Теперь, чтобы облегчить мой переход, я не хочу менять модели, которые используют мои старые модели файлов и папок.
Я хочу создать «виртуальные» модели, называемые «Файлами и папками», в которых нет таблиц в базе данных и вообще нет моделей DjangoORM. Но они должны имитировать поведение c обычных моделей, являясь просто «прокси» или «фасадом» для REST API.
Таким образом, можно использовать модели как обычно:
# Querying files (this actually does request like GET files-service/api/files/all/filter?object_id=157&object_type=user):
user_files = File.objects.filter(object_id=157, object_type='user').all()
# Getting single file (this actually does request like GET files-service/api/files/7611):
single_file = File.objects.get_for_id(7611)
# Using linked object (avatar is a file, loaded by GET files-service/api/files/932, where 932 is stored in a "avatar_id" field, for example)
print(User.avatar.file_url)
Я в основном знаю, как этого добиться:
Моя собственная «виртуальная модель» должна реализовывать что-то вроде «Менеджера», как в обычных моделях, которое должно быть переписано с нуля. чтобы заставить его работать как обычный менеджер, и Менеджер должен возвратить некоторый вид "QuerySet" -pretender, который будет возвращать виртуальные модели файлов и папок, как это делал обычный QuerySet.
Я должен замените импорт в моем коде, поэтому новые модели файлов и папок должны заменить старую (а старая будет удалена из кода)
Я должен создать миксин, который бы использовал таких полей, как "avatar_id" для запроса понравившихся объектов из "виртуальной модели" из файла и папки (не совсем уверен, но думаю, что это будет полезно).
У меня есть несколько вопросов:
Ар Есть ли примеры такого поведения? Я погуглил на «django псевдомоделях», «django виртуальных моделях», «mimi c django моделях поведения» и некоторых других терминах и не нашел ничего полезного.
Я не знаю, как «объединить» большое количество запросов. Например:
# querying all users, prefetching "avatar" element
users = User.objects.prefetch_related('avatar').all()
# grab all avatars urls. In this case all "avatar"s should be already loaded.
avatar_urls = [user.avatar.file_url for user in users]
Я копался в коде Django и обнаружил сложную систему за предварительной загрузкой, поэтому я не уверен, что это будет легко достигать. Может быть, вы можете дать мне несколько советов.