Question

I want to make a custom manager for my models stored in my database 'db2' so that i don't have to do model.objects.using('db2').all(). The code for my models and custom manager is

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

What's wrong with what i am doing here and how to make it work?

Was it helpful?

Solution

SOLUTION : If you just want to use another database 'db2' for every query just use this

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

Later on if you want to add custom querysets override objects manager by making a class inheriting from models.Manager and define your querysets in it.

OTHER TIPS

You can call the method on the parent (using super()) or do the appropriate handling of the _db attribute on the manager (a string containing the name of the database to use). If you want to return a custom QuerySet class from the get_query_set method :

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 is going to be affected by the name of your database.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top