1

我想为存储在我的数据库“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

我在这里做什么以及如何使它工作有什么问题?

4

2 回答 2

2

您可以调用父级上的方法(使用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

或使用这个:

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

于 2013-08-08T05:51:05.250 回答
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 的类并在其中定义您的查询集来覆盖对象管理器。

于 2013-08-28T06:45:56.927 回答