我有一系列看起来像这样的模型:
class Analysis(models.Model):
analysis_type = models.CharField(max_length=255)
def important_method(self):
...do stuff...
class SpecialAnalysis(Analysis):
class Meta:
proxy = True
def important_method(self):
...something different...
这都是很标准的。但是,我想做的是Analysis
根据analysis_type
字段的值自动将模型转换为代理模型。例如,我希望能够编写如下所示的代码:
>>> analysis = Analysis.objects.create(analysis_type="nothing_special")
>>> analysis.__class__
<class 'my_app.models.Analysis'>
>>> analysis = Analysis.objects.create(analysis_type="special")
>>> analysis.__class__
<class 'my_app.models.SpecialAnalysis'>
>>> analysis = Analysis.objects.get(pk=2)
>>> analysis.__class__
<class 'my_app.models.SpecialAnalysis'>
>>> # calls the ``important_method`` of the correct model
>>> for analysis in Analysis.objects.all():
... analysis.important_method()
这甚至有可能吗?此处提出了一个类似的问题,它实际上为迭代示例提供了一些代码,但它仍然给我留下了如何从其父级获取或创建代理类实例的问题。我想我可以重写一堆管理器方法,但我觉得必须有一种更优雅的方法来做到这一点。