Python Django复杂建模?

Python Django复杂建模?,python,django,django-models,Python,Django,Django Models,我正在为一组IT项目构建一个小型报告系统,不知道如何在django模型级别将其组合在一起 这个想法相当简单: 我有一本关于碎布指示器(绿色、黄色、红色等)的字典: DicCoreBase是一个抽象模型,它向所有字典项添加了一些额外的逻辑属性 然后是实际的RAG度量项目(如“进度”、“时间线”、“范围定义”等): 除此之外,还有一些自由文本项,允许用户向其状态记录添加注释和说明: class DicProjectFreeTextReportItem(DicCoreBase): name =

我正在为一组IT项目构建一个小型报告系统,不知道如何在django模型级别将其组合在一起

这个想法相当简单:

我有一本关于碎布指示器(绿色、黄色、红色等)的字典:

DicCoreBase是一个抽象模型,它向所有字典项添加了一些额外的逻辑属性

然后是实际的RAG度量项目(如“进度”、“时间线”、“范围定义”等):

除此之外,还有一些自由文本项,允许用户向其状态记录添加注释和说明:

class DicProjectFreeTextReportItem(DicCoreBase):
    name = models.CharField(max_length=32)
    description = models.TextField()
比如说,我们有两个指标:“绿色”和“红色”,两个指标项目:“进度”和“质量”,还有一个自由文本:“改进完成”。项目报告记录将类似于:

'progress' -> 'green'
'quality' -> 'red'
'improvements done' -> 'fixed all major defects'
绑定到特定的“项目”模型


如何使用标准django建模工具对此进行建模?

1。根据下面的示例,度量项目有一个指示器。这应该是一个:

假设“修复了所有主要缺陷”是自由文本的
description
字段,那么
DicProjectFreeTextReportItem
就可以了

2.由于项目报告记录可以有多个度量项目和自由文本项目,因此应为:

现在,参考上面的示例和我们制作的Django模型,我们可以得到如下信息:

p = Project.objects.get(pk=1)
record = p.reports.all()[0]
print record.metrics.all().values_list('name', flat=True)
# prints ['progress', 'quality']
print record.metrics.get(name='progress').indicator.text_marker
# prints 'green'
'progress' -> 'green'
'quality' -> 'red'
'improvements done' -> 'fixed all major defects'
class DicProjectStatusRAGIndicator(DicCoreBase):
    text_marker = models.CharField(max_length=64)
    color_marker = models.CharField(max_length=6)
    icon = models.FileField(upload_to='RAG_icons')

class DicProjectStatusRAGReportItem(DicCoreBase):
    name = models.CharField(max_length=32)
    description = models.TextField()
    indicator = models.ForeignKey(DicProjectStatusRAGIndicator)
class ProjectReportRecord(models.Model):
    project = models.ForeignKey(Project, related_name='reports')
    metrics = models.ManyToManyField(DicProjectStatusRAGReportItem)
    free_texts = models.ManyToManyField(DicProjectFreeTextReportItem)
p = Project.objects.get(pk=1)
record = p.reports.all()[0]
print record.metrics.all().values_list('name', flat=True)
# prints ['progress', 'quality']
print record.metrics.get(name='progress').indicator.text_marker
# prints 'green'