Как заставить пользовательский менеджер работать с нестандартной базой данных в django?

Я хочу сделать собственный менеджер для своих моделей, хранящихся в моей базе данных 'db2', чтобы мне не пришлось делать model.objects.using('db2').all(), Код для моих моделей и собственного менеджера

class ViewerProfileManager(models.Manager):
    def get_query_set(self):
    return super(ViewerProfileManager,self).using('db2').get_query_set() # results in recursion error

class ViewerProfile(models.Model):
    name = models.CharField(max_length=32)
    count = models.IntegerField(blank=True,null=True)

    objects = models.Manager()
    profiles = ViewerProfileManager()
-------------

>>> ViewerProfile.profiles.all() # maximum recursion depth exceeded error

Что не так с тем, что я делаю здесь, и как заставить это работать?

2 ответа

Решение

РЕШЕНИЕ: Если вы просто хотите использовать другую базу данных 'db2' для каждого запроса, просто используйте эту

class ViewerProfile(models.Model):
    name = models.CharField(max_length=32)
    count = models.IntegerField(blank=True,null=True)

    objects = models.Manager()
    profiles = objects.db_manager('db2')    # manager for evaluating querysets on database db2

Позже, если вы захотите добавить пользовательские наборы запросов, переопределите менеджер объектов, создав класс, унаследованный от models.Manager, и определите в нем ваши наборы запросов.

Вы можете вызвать метод для родителя (используя super()) или выполнить соответствующую обработку атрибута _db в менеджере (строка, содержащая имя базы данных для использования). если вы хотите вернуть пользовательский класс QuerySet из метода get_query_set:

class ViewerProfileManager(models.Manager):
  def get_query_set(self):
      qs = CustomQuerySet(self.model)
      if self._db is not None:
      qs = qs.using(self._db)
      return qs

 OR USE THIS:

class ViewerProfileManager(models.Manager):
  using="db"
  def get_query_set(self,request):
  return super(ViewerProfileManager,self).queryset(request).using(self.using)

class ViewerProfile(models.Model):
name = models.CharField(max_length=32)
count = models.IntegerField(blank=True,null=True)

objects = models.Manager()
profiles = ViewerProfileManager()

На self._db будет влиять имя вашей базы данных

Другие вопросы по тегам