Django - 在Admin中覆盖默认管理器 - InheritanceManager

时间:2016-01-21 14:48:06

标签: python django django-model-utils

(这似乎是一个基于“可能已经有你答案的问题”列表的常见问题,但这些都没有帮助过我。)

我有几个具有多表继承的模型。

在admin(以及之后的前端应用程序中),我需要有一个基类中所有内容的列表,并且还能够识别它们属于哪个子(或孙)类。

我正在尝试使用Inheritance Manager。到目前为止没有运气。

class Entry(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField(max_length=500)
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    slug = models.SlugField(unique=True)
    objects = InheritanceManager()

    def get_queryset(self, request):
        qs = self.model.objects.get_queryset()
        ordering = self.get_ordering(request)
        if ordering:
            qs = qs.order_by(*ordering)
        return qs

    def __str__ (self):
        return self.name + " entry"


class Person(Entity):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    def __str__ (self):
        return self.name + " Person"

添加字符串“person”和“Entry”只是一个测试。

实体列表只显示Entry,即使(实际上)也是一个人。

我希望能够写入显示最终子类的Entry.__str__内容。这样我就可以得到一个条目列表并看到:

Bob (Person)
ABC Co. (Organization)
Great Expectations (Book)

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,并且发现了这种或那样的黑客行为。但它从未感到干净。 我最终使用django-polymorphic ...

  

当我们存储从Project模型继承的模型时......

     

Project.objects.create(topic="Department Party") ArtProject.objects.create(topic="Painting with Tim", artist="T. Turner") ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")

     

...并想要检索我们所有的项目,返回子类模型!

     

Project.objects.all() [ <Project: id 1, topic "Department Party">, <ArtProject: id 2, topic "Painting with Tim", artist "T. Turner">, <ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. Winter"> ]

     

使用vanilla Django,我们得到基类对象,这很少是我们想要的:

     

Project.objects.all() [ <Project: id 1, topic "Department Party">, <Project: id 2, topic "Painting with Tim">, <Project: id 3, topic "Swallow Aerodynamics"> ]

希望有所帮助!