假设我有三个类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