gpt4 book ai didi

python - 在多个模型上使用单个多对多关系表而不是多对多和外键字段?

转载 作者:行者123 更新时间:2023-12-01 06:27:49 25 4
gpt4 key购买 nike

我有一个处理数据分析工作流程的 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 跨许多 Workflow 使用。每个 File 可以有许多关联的 FileMetadata ,其中具有最大 version 值的条目通常用于给定操作。

随着应用程序的不断增长,仅通过使用每个表的外键接口(interface) (Workflow < -> WorkflowItem <-> File <-> FileMetadata )。

我正在考虑构建一个表,将每个关系的所有外键保存在一个位置。像这样的事情:

class WorkflowFile(models.Model):
workflow = models.ForeignKey(Workflow)
workflow_item = models.ForeignKey(WorkflowItem)
file = models.ForeignKey(File)
file_metadata = models.ForeignKey(FileMetadata)

但是,我不确定这是否是一个好主意。我不清楚实现这样的表是否比仅遵循每个表单独的所有外键关系更有优势。我也不清楚应该如何通过 Django 设置这样一个表,以及始终手动向该表中输入值的新要求是否会超过每次我想要查询这些关系时对唯一查询逻辑的需求减少。我的最终目标是提供一种更简单、更一致的方法来根据关系中的任何其他项目获取关系中的所有项目。

This question 在前提上似乎相似,但我不清楚问题或建议的解决方案是否与我在这里寻找的内容相关。

最佳答案

不确定这是否能真正回答您的问题,但如果您想使用多个 FK,那么您可以考虑使用 through表与 m2m changed signal 结合在将 M2M 记录添加到 WorkflowItem 后,向该模型添加正确的 FK。

它会是这样的:

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)

关于python - 在多个模型上使用单个多对多关系表而不是多对多和外键字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60046968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com