Django:自定义模型管理器在抽象类中查询

时间:2011-09-26 01:39:47

标签: django inheritance django-models abstract-class

我正在开发一个django项目,我在其中创建了一组三个抽象模型,稍后我将用于各种应用程序,其中包含三个模型的层次结构。 E.g:

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 个答案:

答案 0 :(得分:2)

以下是有关自定义管理器和模型继承的信息:https://docs.djangoproject.com/en/dev/topics/db/managers/#custom-managers-and-model-inheritance

  

一般问题:通常可以为抽象类创建自定义模型管理器并在继承抽象类的模型中使用它们吗?

答案:是的

你是对的,但是无法查询抽象基类。我不确定你在做什么(选项看起来如何,或者你如何查询它)但希望一般信息会有所帮助

试试这个例子

class Encyclopedia(Book):
   pass

然后查询:

> Encyclopedia.objects.computePrice(me, some_print_job)

答案 1 :(得分:1)

部分(如果不是全部)问题是Django模型类之间没有继承objects

这是一个“功能”而非错误:)。