在多个模型上使用单个ManyToMany关系表而不是ManyToMany和ForeignKey字段?

时间:2020-02-03 20:50:29

标签: python django database

我有一个处理数据分析工作流程的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在前提上似乎相似,但是我不清楚该问题或建议的解决方案是否与我在此处寻找的内容有关。

1 个答案:

答案 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)
相关问题