创建自定义可链接查询集管理器的问题

时间:2011-12-02 11:24:40

标签: python django

在我的项目中,我正在使用来自http://djangosnippets.org/snippets/562/的代码,而我遇到了一些问题。

当我使用自己的ChainableQuerySetManager并尝试通过相关对象创建对象时,我收到了一个递归错误。

ChainableQuerySetManager来源:

    class ChainableQuerySetManager(models.Manager):
        def __init__(self, qs_class=models.query.QuerySet):
            super(ChainableQuerySetManager,self).__init__()
            self.queryset_class = qs_class

        def get_query_set(self):
            return self.queryset_class(self.model)

        def __getattr__(self, attr, *args):
            try:
                return getattr(self.__class__, attr, *args)
            except AttributeError:
                return getattr(self.get_query_set(), attr, *args)

扩展查询集:

    class ExtendedQuerySet(models.query.QuerySet):

        def get_or_None(self, *args, **kwargs):
            result = None
            try:
                result = self.get(*args, **kwargs)
            except ObjectDoesNotExist:
                pass
            return result

测试模型:

    class ParentObject(models.Model):
        value = models.IntegerField(default=0)

        def count_someobjects(self):
            return self.someobjects.count()

        def create_someobject_throw_related(self):
            return self.someobjects.create()

        def create_someobject(self):
            return SomeObject.objects.create(parent=self)

    class SomeObject(models.Model):
        parent = models.ForeignKey(ParentObject, related_name='someobjects')
        value = models.IntegerField(default=1)
        objects = ChainableQuerySetManager(ExtendedQuerySet)

测试用例看起来像:

    class ExtendedQuerySetTests(TestCase):
        def setUp(self):
            self.parent = ParentObject.objects.create()

        def test_create_someobject_in_parent(self):
            someobject = self.parent.create_someobject_throw_related()

感谢您的帮助。 完整来源可以在https://github.com/RANUX/django-simptools

找到

1 个答案:

答案 0 :(得分:0)

我最近有类似的问题。尝试在查询管理器中将self.__class__替换为ChainableQuerySetManager。我从来没有完全理清为什么这是问题,但它确实为我解决了问题。