2011-09-26 172 views
1

我正在研究一個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 

回答

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) 
+0

感謝您的鏈接。我之前讀過這篇文章,但在閱讀後沒有更清楚。我試圖避免的是在每一個從我的抽象類繼承的模型類中重新實現相同的模型管理器。 – phoxley

+0

所以,如果我在我的(抽象)視圖中執行以下查詢,我會得到上面的異常:books = Books.objects.computePrice(user,printJob) – phoxley

+0

我添加了一個示例。 Books是一個抽象基類,您無法對其進行查詢。如果你想查詢某些東西,你需要使用具體的繼承。(查看django-model-utils的繼承管理器) –

1

一部分,如果不是所有的問題的是,objects不被繼承的Django模型類之間。

這是一個「功能」而不是bug:)。

+0

是有意義的。在這種情況下,你有什麼建議我可以繞過這個問題嗎?例如以不同的方式命名我的模型管理器並將其包含在繼承的類中? – phoxley

+0

您可以手動將其包含在繼承的類中,或者將其命名爲除對象之外的其他東西,或者爲您的抽象類定製一個'__metaclass__'來允許繼承對象。 – Dave

相關問題