2013-08-08 3 views
0

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

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 

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

ответ

0

РЕШЕНИЕ: Если вы хотите использовать другой базы данных «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 

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

1

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

+0

где вы указываете это значение _db? –

+0

вы должны указать его self._db = "db_name" – drabo2005

+0

, вы можете использовать первый метод. – drabo2005