Как заставить пользовательский менеджер работать с нестандартной базой данных в 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 будет влиять имя вашей базы данных