Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用单个多个关系表代替多个&;多个模型上的ForeignKey字段?_Python_Django_Database - Fatal编程技术网

Python 使用单个多个关系表代替多个&;多个模型上的ForeignKey字段?

Python 使用单个多个关系表代替多个&;多个模型上的ForeignKey字段?,python,django,database,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

我有一个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()
class WorkflowFile(models.Model):
    workflow = models.ForeignKey(Workflow)
    workflow_item = models.ForeignKey(WorkflowItem)
    file = models.ForeignKey(File)
    file_metadata = models.ForeignKey(FileMetadata)
给定的
工作流
将有许多
工作流项
,它们对应于
文件
,可供
工作流
中的工作流项使用。每个
文件
可以有许多关联的
文件元数据
,其中具有max
version
值的条目通常用于给定的操作

随着应用程序的不断增长,仅通过使用每个表的外键接口(
工作流
工作流项
文件
文件元数据
)就可以根据另一个表中的给定项来构建在一个表中查找条目所需的所有不同逻辑组合,这变得越来越繁琐

我正在考虑建立一个表,在一个地方保存所有关系的外键。大概是这样的:

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()
class WorkflowFile(models.Model):
    workflow = models.ForeignKey(Workflow)
    workflow_item = models.ForeignKey(WorkflowItem)
    file = models.ForeignKey(File)
    file_metadata = models.ForeignKey(FileMetadata)
然而,我不确定这是否是一个好主意。我不清楚实现这样一个表是否比单独跟踪每个表的所有外键关系更有利。我也不清楚我应该如何通过Django设置这样一个表,如果每次我想查询这些关系时,手动将值输入到这个表中的新要求将超过减少对唯一查询逻辑的需求,那么我也不清楚。我的最终目标是提供一种更简单、更一致的方法,根据关系中的任何其他项获取关系中的所有项


似乎前提相似,但我不清楚这个问题或建议的解决方案与我在这里寻找的有关。

不确定这将实际回答你的问题,但是如果你想走多个FK的方式,那么你可以考虑使用表加上添加M2M记录后向这个模型添加适当的FK。
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)