我想为存储在我的数据库'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
我在这里做什么以及如何让它发挥作用有什么问题?
答案 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并在其中定义查询集来添加自定义查询集覆盖对象管理器。