django 管理中的多态行为

2024-04-21

问题

假设我有三个类A、B和C,其中B是A的子类,C是B的子类:

A <- B <- C

当我打开管理并列出所有“A”时,我看到所有“A”、“B”和“C”。但是,当我点击其中一个链接查看详细信息并编辑该特定 B 时,我只会看到 B 的字段,即使该实例实际上是 C 的实例。 我希望看到的是根据其最具体的类型向我展示的对象。

我正在尝试什么

我在用着继承管理器 https://stackoverflow.com/questions/929029/how-do-i-access-the-child-classes-of-an-object-in-django-without-knowing-the-name/929982#929982在更抽象的级别上工作时将实例转换为正确的类型。这几乎可以很好地工作(它不能处理多个继承级别)。但是,即使对于单个继承级别,我也无法在管理员中反映多态行为,因为显然管理员不知道经理的select_subclasses()方法。

关于如何在管理员上获得这种类似多态的行为的任何想法?

具体例子

模型.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)

Update

添加到 2010 年的两个线程的链接,以及关于如何使用 django-polymorphic 实现此目的的一些想法:

  • http://groups.google.com/group/django-polymorphic/browse_frm/thread/84290fe76c40c12d http://groups.google.com/group/django-polymorphic/browse_frm/thread/84290fe76c40c12d
  • http://groups.google.com/group/django-polymorphic/browse_frm/thread/8332d9a71daa7fc5 http://groups.google.com/group/django-polymorphic/browse_frm/thread/8332d9a71daa7fc5

这个答案是片面的,因为我无法重现你的第一个问题。当我列出父模型对象时,我会看到所有它们。 (或者可能存在一些误会。)


字段不完整的问题可以通过内联管理部分解决。由于子类只是一个具有隐式 OneToOneField 到父模型的模型,因此您可以为“C”定义内联,然后将其包含到inlinesB 的管理员属性。

问题是:

  • 用户将无法通过 B 的管理中的内联创建“C”类的对象;只能通过 C 的管理员来完成。仅供观看。
  • 它不适用于多个继承级别:您可以将 B 作为内联包含到 A 的管理中,但我知道没有简单的方法将 C 作为内联包含到 B 的内联中。

另一种方法是修改 A 的管理模板,在其中放置一个指向真实实例(无论是 B 还是 C)的链接。但我想你已经想到了。


关于最后一个问题:如果您想修改某些模型管理员的查询集,可以通过 ModelAdmin 来完成queryset()方法(参见示例这个问题 https://stackoverflow.com/questions/2279313/how-to-limit-queryset-the-records-to-view-in-django-admin-site)。您可以在模型的管理员和位置上覆盖此方法select_subclasses()逻辑在那里。但我还没有尝试过,所以我不能说如果你这样做的话 ModelAdmin 的行为会是什么。也许您需要重写一些方法。


附言。我目前使用django-polymorphic,从事具有具体继承的类似项目。它也没有提供任何通过管理员管理多态模型的方法,所以我决定不再过多依赖 Django 的管理员,而只是为站点工作人员创建一个简单的自定义界面,我想这不会花费太多时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

django 管理中的多态行为 的相关文章

随机推荐