如何链接3个表,其中2个是多对多?

问题描述 投票:0回答:1

我们的数据库模式设计存在问题,我想找出最简洁的解决方法。这三个模型在这些简化的 Django 模型类中定义:

class Animal(Model):
    name = CharField()
    infusion_rate = FloatField()
    infusate = ForeignKey(Infusate)  # but with specific tracer concentrations?

class Infusate(Model):
    name = CharField()
    tracers = ManyToManyForeignKey(Tracer)

class Tracer(Model):
    name = CharField()

目前,我们有一个

through
模型:
Infusate
M:M 关系,添加了
Tracer
浮动字段:
concentration

但我们需要将动物模型与单个输注物联系起来,但其多个示踪剂中的每一个都有特定的浓度。换句话说,我如何将动物与单个输液相关联,但具有属于该输液的特定浓度的多个示踪剂?

我想我可以向

class InfusateTracer(Model): infusate = ForeignKey(Infusate) tracer = ForeignKey(Tracer) concentration = FloatField()

添加一个字段,并使用

InfusateTracer
链接到该字段。我们称之为
Animal
,所以:
animal

但是如何强制 
class InfusateTracer(Model): infusate = ForeignKey(Infusate) tracer = ForeignKey(Tracer) concentration = FloatField() animal = IntegerField()

模型中

infusate
animal
字段之间的关系为 M:1 (即
InfusateTracer
永远不会与多个不同的
InfusateTracer.animal
值同时出现(但多个
InfusateTracer.infusate
)值))?我可以使用某种独特的约束来强制执行吗?
从不同的角度来看,我可以创建一个 AnimalTracer 链接/通过模型,但随后我在检索与动物相关的单个唯一输液名称时也会遇到同样的困难。

试图找出保持数据完整性的最优雅的解决方案正在融化我的大脑。

django-models database-design
1个回答
0
投票
InfusateTracer.tracer

字段放在

animal
中,因为我们已经可以从
InfusateTracer
动物字段中获取信息。相反,如果您希望一只动物只有一个输液记录,您的模型应该如下所示。
infusate

	
© www.soinside.com 2019 - 2024. All rights reserved.