假設我有三個類A,B和C,B是A的子類,C是B的子類:
A <- B <- C
當我打開管理員並列出所有「A」,我看到所有的「A」,「B」和「C」。但是,當我按照其中一個鏈接查看細節並編輯特定的B時,即使該實例實際上是C的一個實例,我也只會看到B的字段。我想看到的是根據其最具體的類型向我展示。
我使用InheritanceManager我試圖
獲得在更抽象的層次上工作時,澆鑄成正確的類型實例。這工作得很好(它不能處理多個繼承級別)。但是,即使對於單一繼承級別,我也無法將多態行爲反映到管理員中,因爲顯然管理員不知道經理的方法select_subclasses()
。
任何想法,我怎麼可以用來獲得這樣的多態行爲的管理?
具體例
models.py:
from django.db import models
from model_utils.managers import InheritanceManager
class A(models.Model):
a_field = models.CharField(max_length=200)
objects = InheritanceManager()
class B(A):
b_field = models.CharField(max_length=200)
class C(B):
c_field = models.CharField(max_length=200)
admin.py
from myapp.models import A, B, C
from django.contrib import admin
admin.site.register(A)
admin.site.register(B)
admin.site.register(C)
更新
增加從2010年到兩個線程的鏈接就如何與實現這一目標的一些想法Django的多態:
- http://groups.google.com/group/django-polymorphic/browse_frm/thread/84290fe76c40c12d
- http://groups.google.com/group/django-polymorphic/browse_frm/thread/8332d9a71daa7fc5
我爲這個問題增加了一個具體的例子。你是對的,列出所有的「A」也會列出「B」和「C」。我也相應地解決了這個問題,併爲剩下的問題添加了更多細節。 – 2011-05-05 15:05:24
感謝您的內聯建議。我肯定可以解決一些使用它們的問題,但正如你所說,它們的適用性非常有限,而且你提出的問題不容忽視。 'queryset()'方法工作得很好,但它也只適用於單個級別(儘管如此,這更多是對'InheritanceManager'的限制)。 – 2011-05-05 15:19:01
當然,忘記django-admin並從零開始做所有事情也是一種選擇。我看到「免費」管理員是django的一大優點,但它開始看起來對這個項目有限制,因爲它會廣泛使用繼承關係。 – 2011-05-05 15:24:16