如何在Django中为模型添加类属性?
我正在使用Django构建一个内部网页应用,用来管理设备和这些设备的分析报告。目前,我定义了一个抽象的分析类,内容如下:
class Analysis(models.Model):
project = models.ForeignKey(Project)
dut = models.ForeignKey(Dut) # Device Under Test
date = models.DateTimeField()
raw_data = models.FileField(upload_to="analysis")
public = models.BooleanField()
@property
def analysis_type(self):
s = str(self.__class__)
class_name = s.split('.')[-1][:-2] # Get latest name in dotted class name as remove '> at end
return AnalysisType.objects.get(name=class_name)
class Meta:
abstract = True
然后,可以对设备进行多种不同类型的分析,结果数据也各不相同。
class ColorAnalysis(Analysis):
value1 = models.FloatField()
value2 = models.FloatField()
...
class DurabilityAnalysis(Analysis):
value1 = models.FloatField()
value2 = models.FloatField()
...
...
每种分析都是由操作员上传的Excel表格创建的。操作员会为每种分析类型填写一个Excel模板。(这里的问题不是说数据输入应该用网页表单,选择Excel有很多原因)在网站的一个页面上,所有分析类型都应该列出,并附上对应的Excel表格模板链接,用于报告该分析。
目前我定义了类似这样的内容:
class AnalysisType(models.Model):
name = models.CharField(max_length=256 )
description = models.CharField(max_length=1024,blank=True )
template = models.FileField(upload_to="analysis_templates")
但是当我考虑如何将这些数据与不同的分析结果模型类关联时,我想我想做的是将这些数据作为类属性添加到每种分析类型中。问题是,类属性已经被Django的魔法用来定义每个实例的数据。
我该如何将“类属性”添加到Django模型中?有没有其他解决方案的想法?
编辑:现在通过查找类名添加了analysis_type属性。这不需要手动为每个子类添加变量。运行得很好,但仍然需要手动为每个子类添加一个对应的AnalysisType条目。如果这个也能通过类系统处理就好了。有任何想法吗?
1 个回答
2
有没有一种属性或方法,可以根据特定分析子类中的某个属性,返回一个与分析类型相关的值呢?
class Analysis(models.Model):
...
@property
def analysis_type(self):
return AnalysisType.objects.get(name=self.analysis_type_name)
class ColorAnalysis(Analysis):
analysis_type_name = 'color'
class DurabilityAnalysis(Analysis):
analysis_type_name = 'durability'