对于Concert的实例,必须使用Concert实例作为第一个参数调用unbound方法do\u 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\u的\u stuff子类方法。
首先,请参见Template method
其次,事件类应该是抽象的。你知道吗
第三,参见Single Table Inheritance和Class Table Inheritance模式。 以及模式的django-ORM实现there 好运=)
在我看来,您的
Event
模型仅用于继承,因此您应该抽象它:关于
Event
的用法,我可能是错的,但是如果是,抽象Event
模型将使它像一个普通类一样,我的意思是不会对这样的模型采取任何数据库操作。你知道吗希望这有帮助!:)
在Django中,继承触发多表继承,但在Python中没有多态性。它只是ORM的一个实例,没有在数据模式和对象模型之间提供完美的对应关系。你知道吗
换句话说,当您查询Event时,您会返回一大堆Event对象,而不管其中的一些对象是Concert对象还是Party对象。你必须手动向下转换。如果一个事件是Concert,它将有一个名为
concert
的属性,该属性指向对应的Concert子类。派对也一样。如果它只是一个普通事件,那么它将没有任何属性。你知道吗您可以在事件上使用以下属性来自动向下转换对象:
然后你可以这样做:
类似的问题以前也出现过:
这个链接还有其他一些想法:
相关问题 更多 >
编程相关推荐