Как динамически поменять базу данных по умолчанию на менеджере моделей в Django? - PullRequest
0 голосов
/ 26 февраля 2019

Я создаю проект в django и django rest framework.Это API для углового приложения.Настройка базы данных состоит из нескольких баз данных.одна - база данных по умолчанию, все таблицы django находятся в этой базе данных;остальные базы данных принадлежат к типу пользователей, каждый пользователь должен иметь отдельную базу данных.Таким образом, все пользовательские данные отправляются в отдельную базу данных.Чтобы динамически реализовать выбор базы данных, пользовательский объект имеет дополнительное поле для хранения базы данных, в которую необходимо выполнить запись.

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    """Custom User model."""

    database= models.CharField(max_length=9)

Причиной этого было повышение производительности, поскольку каждая база данных является отдельной, ListView и DetailView будут работать быстрее, чемесли данные были сохранены только в одной базе данных.

Я знаю, что могу выбрать базу данных для хранения, используя метод using в менеджере моделей.В остальном API-интерфейсы работают нормально, и данные хранятся в отдельных базах данных, но в итоге я переопределил методы, которые определил django.Это добавление стоимости разработки к проекту.Внешние ключи и ключи ManytoMany должны быть разрешены в текущей базе данных пользователя, чего не происходит, поскольку я настроил настройку базы данных.Кроме того, мой код не может быть таким же хорошим, как у них: p, как они пишут django в течение многих лет.

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

Мои вопросы -

  1. Есть ли способ получить доступ к объекту запроса в менеджере моделей?Я мог бы сделать что-то с эффектом приведенного ниже кода.

    класс CustomManager (models.Manager):

    def get_queryset(self, request):
    
        return super(CustomManager, self).using(request.user.database).get_queryset()
    
  2. Менеджер моделей имеет свойство _db, которое можно использовать длявыберите базу данных.Будет ли это лучше?если да, то как и где в коде?

  3. Есть ли лучший способ реализовать отдельные базы данных?

Заранее спасибо.

С уважением

1 Ответ

0 голосов
/ 27 февраля 2019

В Django docs рекомендуется использовать маршрутизатор базы данных , но проблема в том, что он обращается только к классу модели.

Нашел пару вопросов, связанных с проблемой динамического переключения баз данных. В этом посте есть решение , которое решило бы проблему передачи request.user или любого другого параметра с помощью threading.local instance .

Кто-то создал многоразовыйплагин даже для этого - https://github.com/ambitioninc/django-dynamic-db-router

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

...