如何让自定义管理器在django中使用非默认数据库?

时间:2013-08-08 05:32:27

标签: django python-2.7 django-1.5 django-managers

我想为存储在我的数据库'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 个答案:

答案 0 :(得分:2)

您可以在父级上调用该方法(使用super())或在管理器上执行_db属性的适当处理(包含要使用的数据库名称的字符串)。 如果要从get_query_set方法返回自定义QuerySet类:

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将受到数据库名称的影响

答案 1 :(得分: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

稍后如果要通过使类继承自models.Manager并在其中定义查询集来添加自定义查询集覆盖对象管理器。