我的型号如下,
class FooBarAbstract(models.Model):
foobar = models.IntegerField()
class Meta:
abstract = True
class Foo(FooBarAbstract):
foo = models.IntegerField()
class Bar(FooBarAbstract):
bar = models.IntegerField()
如何通过使用子类(FooBarAbstract
或Foo
)或它们的对象来获得抽象类名称(Bar
)?
答案 0 :(得分:2)
您可以从类的__bases__
属性中获取类的基类的名称。
假设您的派生类始终仅继承一个类,则可以使用以下方法获取基类的名称:
class Foo(FooBarAbstract):
def __init__(self):
print(self.__class__.__bases__[0].__name__)
这样Foo()
会输出:FooBarAbstract
请注意,mro
方法和__mro__
属性不适合您的用途,因为它们不仅包含父类,而且还包含当前类和父类的父类,因此您必须先跳过它们,然后才能获取父类。
答案 1 :(得分:1)
通过使用python __bases__
,它将返回基类名称的元组:
class Foo():
pass
class Bar(Foo):
pass
bb = Bar
bb.__bases__[0].__name__
# 'Foo'
但是我不知道django中是否还有其他方法可以解决这个问题。
答案 2 :(得分:0)
尝试类似的方法,这是一个示例,您可以根据Django层次结构更改索引。
class Foo():
pass
class Bar(Foo):
pass
class Eggs(Foo):
pass
Now for Eggs课
Eggs.mro()[-2].__name__ # change your index accordingly to your class inheritance structure.
返回Foo
有关信息:
Django的抽象类只是为了确保它们不会在数据库中创建额外的表。