1

使用 Concert 的实例,我得到:必须使用 Concert 实例作为第一个参数调用未绑定的方法 do_stuff()(改为使用 ModelBase 实例)

模型.py:

class Event(models.Model):
    def do_stuff(self):
        response self.do_specific_stuff(self)


class Concert(Event):
    def do_specific_stuff(self):
        ...

class Party(Event):
    def do_specific_stuff(self):
        ...

意见:

def index(request):
    x = Concert.objects.get(name='Jack White @ Oakland')
    output = x.do_stuff()
    return HttpResponse(output)

我的目标是循环遍历所有事件并根据事件类型执行 do_specific_stuff 子类方法。

4

3 回答 3

3

在 Django 中,继承触发了多表继承,但在 Python 中你没有得到多态性。它只是 ORM 的一个实例,没有提供数据模式和对象模型之间的完美对应。

换句话说,当您查询 Event 时,您会得到一大堆 Event 对象,而不管其中一些实际上是 Concert 还是 Party 对象。您必须手动向下转换。如果 Event 是 Concert,它将有一个名为 的属性concert,该属性指向相应的 Concert 子类。派对也是如此。如果它只是一个普通的 Event,它不会有任何属性。

您可以在 Event 上使用以下属性来自动向下转换您的对象:

@property
def as_child_class(self):
    """Casts this object to its subclass, if possible"""

    if hasattr(self, 'concert'):
        return self.concert
    elif hasattr(self, 'party'):
        return self.party
    else:
        return self

然后你可以做类似的事情:

for event in Event.objects.all()
    event.as_child_class.do_specific_stuff()

之前也出现过类似的问题:

这个链接还有一些其他的想法:

于 2012-11-20T15:27:24.930 回答
0

在我看来,您的Event模型用于继承,因此您应该抽象它:

class Event(models.Model):
    class Meta:
        absract = True

    def do_stuff(self):
        response self.do_specific_stuff()

    def do_specific_stuff(self):
        raise NotImplemented


class Concert(Event):
    def do_specific_stuff(self):
        ...


class Party(Event):
    def do_specific_stuff(self):
        ...

我可能对您EventEvent.

希望这可以帮助!:)

于 2012-11-20T15:46:17.963 回答
0

首先看模板方法

其次,Event 类应该是抽象的。

class Event:
   def __init__:
       raise NotImplemented('This class is abstract')

第三,参见单表继承类表继承模式。还有django-ORM的模式实现 祝你好运=)

于 2012-11-20T16:18:22.240 回答