В Python / Django, как я могу проверить, является ли объект подклассом X, учитывая этот объект как родительский класс? - PullRequest
1 голос
/ 19 января 2012

у меня есть:

class Foo(models.Model):
    pass

class Bar(Foo):
    pass

class Corn(Foo):
    pass

# Now I have these objects in the database:
john = Corn()
mary = Corn()
joe = Bar()
grace = Corn()
randy = Bar()

В Django я использую это, чтобы получить список объектов Foo:

foos = Foo.objects.all()

Теперь, как мне проверить, является ли объект в списке foos выше Bar или Corn?

for x in foos:
    print x.__class__.__name__ # returns Foo

1 Ответ

0 голосов
/ 19 января 2012

Наследование модели не будет автоматически возвращать экземпляры подкласса - если вы спросите ORM о Foos, он выдаст вам Foos. Вам нужно спросить, есть ли объект Bar с тем же первичным ключом:

for x in foos:
   Bar.objects.filter(pk=x.pk).exists() # True if it's a Bar, too
   Corn.objects.filter(pk=x.pk).exists() # True if it's a Corn, too

Вы также можете использовать имя модели (в нижнем регистре) в качестве атрибута, который будет выполнять поиск за вас, но это не гарантирует успеха (очевидно), поэтому вам нужно защититься от исключений типа DidNotExist:

for x in foos:
    try:
        x.bar
        # it's a bar
    except Bar.DoesNotExist:
        # it's not a bar
        pass
    try:
        x.corn
        # it's a corn
    except Corn.DoesNotExist:
        # it's not a corn
        pass
...