我有一个处理数据分析工作流程的Django应用程序,其数据库模型如下所示:
class Workflow(models.Model):
execution_id = models.UUIDField()
class WorkflowItem(models.Model):
workflow = models.ForeignKey(Workflow)
type = models.CharField(choices=["input", "output"])
files = models.ManyToManyField(File)
class File(models.Model):
path = models.CharField()
class FileMetadata(models.Model):
metadata = models.JSONField()
file = models.ForeignKey(File)
version = models.IntegerField()
给定的Workflow
将具有许多WorkflowItem
,它们对应于File
可以被许多WorkflowItem
的{{1}}使用的。每个Workflow
可以具有许多关联的File
,其中具有最大FileMetadata
值的条目通常用于给定的操作。
随着应用程序的发展,仅通过使用每个表的外键接口({{ 1}} <-> version
<-> Workflow
<-> WorkflowItem
)。
我正在考虑只建立一个表,在一个地方包含每个关系的所有外键。像这样:
File
但是,我不确定这是否是一个好主意。与仅按每个表单独跟踪所有外键关系相比,实现这样的表是否有利于我尚不清楚。我也不清楚如何通过Django来建立这样的表,并且如果每次始终要手动向该表中输入值的新要求超过了我每次查询这些关系时对唯一查询逻辑的减少需求。我的最终目标是提供一种更简单,更一致的方式来基于关系中的其他任何项来获取关系中的所有项。
This question在前提上似乎相似,但是我不清楚该问题或建议的解决方案是否与我在此处寻找的内容有关。
答案 0 :(得分:1)
不确定这是否会真正回答您的问题,但是如果您想使用多个FK,则可以考虑将through表与m2m changed signal结合使用,以在添加此模型后向此模型中添加适当的FK M2M记录到WorkflowItem
。
会是这样的:
from django.db.models.signals import m2m_changed
class WorkflowItem(models.Model):
workflow = models.ForeignKey(Workflow)
type = models.CharField(choices=["input", "output"])
files = models.ManyToManyField(File, through=IntermediateTable)
class IntermediateTable(models.Model):
file = models.ForeignKey(File, related_name='file')
workflow_item = models.ForeignKey(WorkflowItem, related_name='worflowitem')
workflow = models.ForeignKey(Workflow, null=True)
file_metadata = models.ForeignKey(FileMetadata)
def workflow_item_changed(sender, **kwargs):
sender.workflow = sender.workflow_item.workflow
...
sender.save()
m2m_changed.connect(workflow_item_changed, sender=WorkflowItem.files.through)