gpt4 book ai didi

django - django 管理中的多态行为

转载 作者:行者123 更新时间:2023-12-04 06:28:02 25 4
gpt4 key购买 nike

问题

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

A <- B <- C

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

我在尝试什么

我正在使用 InheritanceManager在更抽象的级别工作时将实例转换为正确的类型。这几乎工作得很好(它不能处理多个继承级别)。但是,即使对于单个继承级别,我也无法在管理员中反射(reflect)多态行为,因为显然管理员不知道经理的 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)

管理文件
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-polymorphic 实现此目标的一些想法:
  • http://groups.google.com/group/django-polymorphic/browse_frm/thread/84290fe76c40c12d
  • http://groups.google.com/group/django-polymorphic/browse_frm/thread/8332d9a71daa7fc5
  • 最佳答案

    这个答案是部分的,因为我无法重现您的第一个问题。当我列出父模型对象时,我会看到所有这些对象。 (或者可能有一些误解。)

    使用 admin inline 可以部分解决字段不完整的问题。由于子类只是一个带有隐式 OneToOneField 到父模型的模型,您可以为“C”定义一个内联,然后将其包含到 inlines 中。 B 的管理员的属性。

    问题是:

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

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

    关于最后一个问题:如果你想修改一些模型管理员的查询集,可以通过模型管理员的 queryset()来完成。方法(参见 this question 中的示例)。您可以在模型的管理员上覆盖此方法并放置 select_subclasses()那里的逻辑。但我还没有尝试过,所以我不能说如果你这样做的话 ModelAdmin 的行为会是什么。也许你需要覆盖更多的方法。

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

    关于django - django 管理中的多态行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5793901/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com