如何调用超类方法并返回子类实现?

时间:2016-03-31 01:50:23

标签: python django django-models

我有这个型号:

from django.db import models

class Item(models.Model):
    # ...

    def __str__(self):
        return 'item'

class SubItemA(Item):
    # ...

    def __str__(self):
        return 'subitem_a'

class SubItemB(Item):
    # ...

    def __str__(self):
        return 'subitem_b'

我想从Item.object.all()中的每个Item调用 __ str __ 方法并返回每个子类实现,但它只返回超类实现。

示例:

for item in Item.object.all():
    print(item.__str__())

在我的数据库中,我有两个SubItemA和两个SubItemB。比它返回:

item
item
item
item

我想有这样的事情:

subitem_a
subitem_a
subitem_b
subitem_b

我迷失在这里。

2 个答案:

答案 0 :(得分:1)

有点牵扯。您可以查看Django model subclassing: Get the subclass by querying the superclass进行完整讨论。

简短的回答,来自那个问题:

def related_object(self, default_pointer_name='_ptr'):
    models = [A,B] #models
    object = None

    argument = '%s%s' %(self.__class__.__name__.lower(), default_pointer_name)
    query = { argument : self}

    for model in models:
        try:
            object = model.objects.get(**query)
        except model.DoesNotExist:
            pass
        else:
            return object

    if object == None:
        raise RelatedObjectException
    return object

# This is a method used by BaseMedium.

答案 1 :(得分:0)

有了这个,你就会遇到更多问题。没有重新发明轮子的干净解决方案是使用Django Polymorphic

之类的东西