5

玩弄多态和其他插件我想知道如何防止某些基类字段显示在子管理界面的表单中。为我的孩子班级提供这个 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 中的表单显示了基类和子类的所有文件。我尝试为子类添加 exclude = list() 但这不起作用(没有变化)。

4

1 回答 1

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 对象(语法:精确模型名称 + 三个 _ + 字段名称):

>>> 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)> ]
于 2016-04-28T20:11:47.960 回答