如何从通过PolymorphicChildModelAdmin

时间:2016-04-26 14:17:24

标签: python django django-polymorphic

使用Polymorphic和其他插件稍微玩一下我想知道如何防止某些基类字段显示在子管理界面的表单内部。为我的子类提供此adminy.py:

from django.contrib import admin
from .models import *
from partsmanagement.models import Part
from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin

admin.site.register(Book)

class BookAdmin(PolymorphicChildModelAdmin):
    base_model = Part

以及基本模型的admin.py:

# -*- coding: utf-8 -*-

from django.contrib import admin
from .models import *
from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin
from bookcollection.models import Book
from bookcollection.admin import BookAdmin

admin.site.register(Part)

class PartAdmin(PolymorphicParentModelAdmin):
    base_model = 'Part'
    child_models = (
        (Book, BookAdmin),
    )

现在,admin中的表单显示了base和child类的所有文件。我试图为子类添加exclude = list()但这没有用(没有变化)。

1 个答案:

答案 0 :(得分:0)

过滤类(相当于python' isinstance()):

>>> ModelA.objects.instance_of(ModelB)
.
[ <ModelB: id 2, field1 (CharField), field2 (CharField)>,
  <ModelC: id 3, field1 (CharField), field2 (CharField), field3 (CharField)> ]

通常,包含或排除继承树的部分:

ModelA.objects.instance_of(ModelB [, ModelC ...])
ModelA.objects.not_instance_of(ModelB [, ModelC ...])

您也可以在Q-objects中使用此功能(结果与上述相同):

>>> ModelA.objects.filter( Q(instance_of=ModelB) )

多态过滤(对于派生类中的字段)

例如,使用Q对象(使用语法:exact model name + three _ + field name)从继承树中的任何位置挑选来自多个派生类的对象:

>>> ModelA.objects.filter(  Q(ModelB___field2 = 'B2') | Q(ModelC___field3 = 'C3')  )
.
[ <ModelB: id 2, field1 (CharField), field2 (CharField)>,
  <ModelC: id 3, field1 (CharField), field2 (CharField), field3 (CharField)> ]

合并查询集

现在可以将查询集视为允许聚合不同对象类型的对象容器,与python列表非常相似 - 只要通过公共基类的管理器访问对象:

>>> Base.objects.instance_of(ModelX) | Base.objects.instance_of(ModelY)
.
[ <ModelX: id 1, field_x (CharField)>,
  <ModelY: id 2, field_y (CharField)> ]