我有一个基本的Django模型,以及将其子类化的代理模型。它们会覆盖所有方法。我需要遍历基本模型的所有实例(即for i in BaseModel.objects.all()
),但能够调用其相应代理类的方法,而不是基类中声明的占位符方法。
我该如何处理?我实际上有一个模型字段,可以确定哪个代理模型对应于每个特定实例。也许我可以利用它并以某种方式将基类转换为子类?我很茫然。
编辑:我看过this question,并设法通过写信self.__class__
来改变课程。但是,与Django一起使用是否安全?
答案 0 :(得分:2)
proxymodels = {"Foo": FooModel, "Bar": BarModel}
for o in BaseModel.objects.all():
proxymodels[o.type].method_name(o, *args, **kwargs)
在代理模型(类)上调用方法,将BaseModel实例作为第一个参数传递,并传递您想要传递的任何其他参数。这样就可以调用这些方法,就好像它们是在代理模型的实例上调用一样。
PS:重新分配自我.__ class__对我来说似乎非常苛刻。