gpt4 book ai didi

python - 从它们的基类创建 Django 代理模型的实例

转载 作者:太空狗 更新时间:2023-10-29 21:22:28 25 4
gpt4 key购买 nike

我有一系列看起来像这样的模型:

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_type 字段的值自动将 Analysis 模型转换为代理模型。例如,我希望能够编写如下代码:

>>> 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()

这有可能吗?问了一个类似的问题here ,它实际上为迭代示例提供了一些代码,但它仍然留给我一个问题,即如何从其父级获取或创建代理类的实例。我想我可以覆盖一堆管理器方法,但我觉得必须有更优雅的方法来做到这一点。

最佳答案

我还没有找到一种“干净”或“优雅”的方式来做到这一点。当我遇到这个问题时,我通过稍微欺骗 Python 解决了它。

class Check(models.Model):
check_type = models.CharField(max_length=10, editable=False)
type = models.CharField(max_length=10, null=True, choices=TYPES)
method = models.CharField(max_length=25, choices=METHODS)
'More fields.'

def __init__(self, *args, **kwargs):
super(Check, self).__init__(*args, **kwargs)
if self.check_type:
map = {'TypeA': Check_A,
'TypeB': Check_B,
'TypeC': Check_C}
self.__class__ = map.get(self.check_type, Check)

def run(self):
'Do the normal stuff'
pass


class Check_A(Check):
class Meta:
proxy = True

def run(self):
'Do something different'
pass

class Check_B(Check):
class Meta:
proxy = True

def run(self):
'Do something different'
pass


class Check_C(Check):
class Meta:
proxy = True

def run(self):
'Do something different'
pass

它不是很干净,但它是解决我问题的最简单的 hack。

也许这对你有帮助,也许没有。

我也希望其他人对这个问题有一个更 pythonic 的解决方案,因为我正在计算这个方法失败并回来困扰我的日子..

关于python - 从它们的基类创建 Django 代理模型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18473850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com