如何通过代码获取Django模型对象的继承来源?
如何获取Django模型的继承来源?
当然可以啦!Django的模型类本质上还是Python类,所以我们可以利用Python本身的类属性或者标准库工具来轻松获取它的继承关系。针对你给出的RealObj示例,这里有几种实用的实现方式:
获取直接父类
如果只需要知道直接父类(也就是RealObj直接继承的SWT),可以使用Python类的__base__或__bases__属性:
__base__返回单个直接父类(适用于单继承场景,你的例子就是这种情况)__bases__返回一个元组,包含所有直接父类(支持多继承)
示例代码:
# 获取直接父类 direct_parent = RealObj.__base__ print(direct_parent.__name__) # 输出: SWT # 或者用__bases__,单继承下取第一个元素即可 direct_parent_from_bases = RealObj.__bases__[0] print(direct_parent_from_bases.__name__) # 同样输出: SWT
获取完整的继承链
如果需要查看所有继承层级(包括抽象基类CDate,甚至Django的models.Model),可以使用标准库inspect中的getmro()方法,它会返回按方法解析顺序排列的类元组:
示例代码:
import inspect # 获取完整继承链 inheritance_chain = inspect.getmro(RealObj) # 遍历输出所有类的名称 for cls in inheritance_chain: print(cls.__name__) # 输出顺序为: RealObj, SWT, CDate, models.Model, object
如果你只想筛选出自定义的模型父类(排除Django自带的models.Model和Python的object),可以做个简单的过滤:
import inspect from django.db import models custom_parents = [cls for cls in inspect.getmro(RealObj) if cls not in (models.Model, object)] # 输出自定义父类列表: [RealObj, SWT, CDate] # 若要排除自身,取切片即可: custom_parents[1:] → [SWT, CDate]
内容的提问来源于stack exchange,提问作者user2194805
相关产品推荐
相关产品推荐

