Как получить абстрактное имя класса из дочернего класса - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть несколько моделей, как показано ниже,

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)) или их объекты?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Имена базовых классов класса можно получить из атрибута класса '__bases__.

Предполагая, что ваши производные классы всегда наследуются только от одного класса, вы можете использовать следующее для получения имени базового класса:

class Foo(FooBarAbstract):
    def __init__(self):
        print(self.__class__.__bases__[0].__name__)

, чтобы Foo() вывел: FooBarAbstract

Обратите внимание, что метод mro и атрибут __mro__ менее подходят для вашей цели, поскольку они содержат не только родительский класс, но также текущий класс и родительский класс родительского класса, поэтому вам придется пропустите их, прежде чем сможете получить родительский класс.

0 голосов
/ 10 сентября 2018

Используя python __bases__, он вернет кортеж имен базовых классов:

class Foo():
    pass

class Bar(Foo):
    pass

bb = Bar
bb.__bases__[0].__name__
# 'Foo'

Но я не знаю, есть ли в django какой-то дополнительный способ справиться с этим.

0 голосов
/ 10 сентября 2018

Попробуйте что-то вроде этого, это пример, и вы можете изменить индекс в соответствии с иерархией Django.

class Foo():
    pass

class Bar(Foo):
    pass

class Eggs(Foo):
    pass

Теперь для яиц класса

Eggs.mro()[-2].__name__ # change your index accordingly to your class inheritance structure.

Возвращает Foo

для информации:

Абстрактный класс Django просто для того, чтобы убедиться, что он не создает дополнительную таблицу в базе данных.

...