我正在研究一個django項目,在該項目中,我創建了一組三個抽象模型,稍後將用於各種應用程序,所有這些模型都將包含三個模型的層次結構。例如: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
除了這些抽象類,我想爲每個抽象類定製模型管理器類,會派上用場,後來在繼承經理
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
感謝您的鏈接。我之前讀過這篇文章,但在閱讀後沒有更清楚。我試圖避免的是在每一個從我的抽象類繼承的模型類中重新實現相同的模型管理器。 – phoxley
所以,如果我在我的(抽象)視圖中執行以下查詢,我會得到上面的異常:books = Books.objects.computePrice(user,printJob) – phoxley
我添加了一個示例。 Books是一個抽象基類,您無法對其進行查詢。如果你想查詢某些東西,你需要使用具體的繼承。(查看django-model-utils的繼承管理器) –