Python 从Django代理模型的基类创建其实例
我有一系列这样的模型:Python 从Django代理模型的基类创建其实例,python,django,Python,Django,我有一系列这样的模型: 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(s
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.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()
这是很标准的。但是,我想做的是根据Analysis\u type
字段的值自动将Analysis
模型转换为代理模型。例如,我希望能够编写如下代码:
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.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()
>>analysis=analysis.objects.create(analysis\u type=“nothing\u special”)
>>>分析课程__
>>>分析=分析.objects.create(分析类型=“特殊”)
>>>分析课程__
>>>analysis=analysis.objects.get(pk=2)
>>>分析课程__
>>>调用正确模型的“重要”方法
>>>用于analysis.objects.all()中的分析:
... 分析。重要的_方法()
这有可能吗?有人问了一个类似的问题,它实际上为迭代示例提供了一些代码,但它仍然留给我一个问题,即如何从父类获取或创建代理类的实例。我想我可以重写一堆管理器方法,但我觉得必须有一种更优雅的方法来做这件事。我还没有找到一种“干净”或“优雅”的方法来做这件事。当我遇到这个问题时,我通过稍微欺骗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
它不是很干净,但它是最容易找到解决我问题的方法
也许这对你有帮助,也许没有
我也希望其他人能有一个更为通灵的方法来解决这个问题,因为我正在计算这个方法失败并再次困扰我的天数。这是一个很好的方法,我并不特别认为它是一个骗局。下面是对
\uuuu init\uuu
函数的一些增强,这样在添加更多类时它就不必更改了
def __init__(self, *args, **kwargs):
super(Analysis, self).__init__(*args, **kwargs)
if not self.__type and type(self) == Analysis:
raise Exception("We should never create a base Analysis object. Please create a child proxy class instead.")
for _class in Analysis.__subclasses__():
if self.check_type == _class.__name__:
self.__class__ = _class
break
def save(self, **kwargs):
self.check_type = self.__class__.__name__
super(Analysis, self).save(**kwargs)
希望这有帮助 嗯,这肯定比我尝试的那些疯狂的东西更干净。谢谢你的帮助!您的方法本身不太可能失败,但手动映射肯定不能很好地缩放;使用该模型可以更好地服务于未来的访问者。\ uuuu子类\ uuuu()方法可以获取代理模型列表,并根据需要动态查询部分/全部代理模型。哦,太好了。如果不知道
\uuuuu子类\uuuuu
,它肯定会提高可维护性。