有很多地方建议在一对多或多对一的关系中使用ForeignKey,但我很难理解这将如何工作而不逆转依赖性。
例如:
我有这两个应用程序,‘结算’和‘支付’,理想情况下,结算不需要知道付款,因为付款记录是在结算后创建的,而且支付记录可以包含多个结算。
住区模式:
class Settlement(models.Model):
...付款模式:
class Payment(models.Model):
settlements = models.ManyToManyField('Settlement')
....这带来了一个基本的模式警告,结算可以属于多支付,这是不应该发生的。
为了强制执行一项不能属于多个付款记录的和解,我必须将支付foreignkey放在结算中:
住区模式:
class Settlement(models.Model):
payment = models.ForeignKey('Payment')
...付款模式:
class Payment(models.Model):
....虽然这加强了模式的有效性,但似乎依赖已经逆转,现在结算需要了解支付,刚刚使这两个应用程序紧密耦合。此外,我需要创建一个结算记录与支付字段为空,创建付款记录,然后回到结算记录链接付款记录,这似乎是错误的。
发布于 2014-09-03 03:55:02
发布于 2014-09-03 03:29:38
虽然模式在Settlement上有一个链接到Payment的外键可能是有意义的,但是您的应用程序不必有这种关系(或者在数据库上强制)。我假设Settlement不能更改,而且您只能使用Payment应用程序。
只需创建您自己的中间模型/表,并将其与支付链接。这就像拥有一个ManyToMany关系,但您可以对其强制执行约束。
class Payment(models.Model):
# your fields go here
class Invoice(models.Model):
settlement = models.OneToOneField('settlements.Settlement')
payment = models.ForeignKey(Payment)注意OneToOneField。这本质上是一个有唯一约束的外键。我们模拟的是一个ManyToMany中间表,但将settlement限制在发票表中只有一条记录。
我可能应该注意到,由于我们在这里创建了一个新表,未来的查询可能会因为所需的额外联接而变得缓慢。如果您修改Settlement模型以包括一个ForeignKey,那么从规范化的意义上看,它会执行得更好,看起来也更好。
https://stackoverflow.com/questions/25635408
复制相似问题