Проблемы с созданием настраиваемого цепного менеджера наборов запросов - PullRequest
1 голос
/ 02 декабря 2011

В моем проекте я использую код из 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 голосов
/ 02 декабря 2011

У меня недавно была похожая проблема. Попробуйте заменить self.__class__ на ChainableQuerySetManager в вашем диспетчере запросов. Я никогда не мог точно разобраться, почему это была проблема, но это действительно помогло мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...