如何在Django中为模型添加类属性?

1 投票
1 回答
3064 浏览
提问于 2025-04-16 10:22

我正在使用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'

撰写回答