Django: пользовательский менеджер моделей запросов в абстрактных классах - PullRequest
1 голос
/ 26 сентября 2011

Я работаю над проектом django, в котором я создаю набор из трех абстрактных моделей, которые позже я буду использовать для различных приложений, каждый из которых будет содержать эту иерархию из трех моделей.Например:

class Book(models.Models):
    name = models.CharField(...)
    author = models.CharField(...)
    ...

    objects = BookManager()

    class Meta:
        abstract = True

class Page(models.Models):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    chapter = models.CharField(...)
    ...

    objects = PageManager()

    class Meta:
        abstract = True

class Word(models.Models):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    line = models.IntegerField(...)
    ...

    objects = WordManager()

    class Meta:
        abstract = True

Помимо этих абстрактных классов, я хочу предоставить настраиваемые классы Model Manager для каждого абстрактного класса, которые позже пригодятся в приложениях, которые наследуют менеджеры

class BookManager(models.Manager):

    def computePrice(self, user, printJob):
        price = 0
        ...

class PageManager(models.Manager):

    def getPagesOfBook(self, book):
        return self.filter(content_type=book, object_id=book.id)
    ...

....

Общий вопрос: возможно ли вообще создать настраиваемые менеджеры моделей для абстрактных классов и использовать их в моделях, которые наследуют абстрактный класс?

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

Если я не ошибаюсь, то одна из причин, почему это не работает, -потому что абстрактные модели не могут быть запрошены.В основном я спрашиваю, есть ли способ, как я могу реализовать то, что я описал выше, и если да, то как это можно сделать.

Request Method: POST
Request URL:    http://127.0.0.1:8000/
Django Version: 1.3
Exception Type: AttributeError
Exception Value:    'Options' object has no attribute '_join_cache'
Exception Location: /usr/local/lib/python2.7/dist-packages/django/db/models/sql/query.py     in setup_joins, line 1267
Python Executable:  /usr/bin/python
Python Version: 2.7.1

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Вот информация о пользовательских менеджерах и модели наследования: https://docs.djangoproject.com/en/dev/topics/db/managers/#custom-managers-and-model-inheritance

Общий вопрос: возможно ли вообще создать настраиваемые менеджеры моделей для абстрактных классов и использовать их в моделях, которые наследуют абстрактный класс?

Ответ: Да

Вы правы, что абстрактные базовые классы не могут быть запрошены, хотя. Я не совсем уверен, что вы делаете (как выглядит Options или как вы его запрашиваете), но, надеюсь, общая информация поможет

Попробуйте это в качестве примера

class Encyclopedia(Book):
   pass

А затем запрос:

> Encyclopedia.objects.computePrice(me, some_print_job)
1 голос
/ 26 сентября 2011

Отчасти, если не вся проблема, в том, что objects не наследуется между классами модели Django.

Это "особенность", а не ошибка :)

...