首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django一对多字段而不逆转依赖关系。

Django一对多字段而不逆转依赖关系。
EN

Stack Overflow用户
提问于 2014-09-03 02:43:17
回答 2查看 4.1K关注 0票数 4

有很多地方建议在一对多或多对一的关系中使用ForeignKey,但我很难理解这将如何工作而不逆转依赖性。

例如:

我有这两个应用程序,‘结算’和‘支付’,理想情况下,结算不需要知道付款,因为付款记录是在结算后创建的,而且支付记录可以包含多个结算。

住区模式:

代码语言:javascript
复制
class Settlement(models.Model):
    ...

付款模式:

代码语言:javascript
复制
class Payment(models.Model):
    settlements = models.ManyToManyField('Settlement')
    ....

这带来了一个基本的模式警告,结算可以属于多支付,这是不应该发生的。

为了强制执行一项不能属于多个付款记录的和解,我必须将支付foreignkey放在结算中:

住区模式:

代码语言:javascript
复制
class Settlement(models.Model):
    payment = models.ForeignKey('Payment')
    ...

付款模式:

代码语言:javascript
复制
class Payment(models.Model):
    ....

虽然这加强了模式的有效性,但似乎依赖已经逆转,现在结算需要了解支付,刚刚使这两个应用程序紧密耦合。此外,我需要创建一个结算记录与支付字段为空,创建付款记录,然后回到结算记录链接付款记录,这似乎是错误的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-03 03:55:02

我的一个同事发现了这个项目:

https://github.com/adsworth/django-onetomany

它在多个关系中添加了一个独特的联合约束。

票数 1
EN

Stack Overflow用户

发布于 2014-09-03 03:29:38

虽然模式在Settlement上有一个链接到Payment的外键可能是有意义的,但是您的应用程序不必有这种关系(或者在数据库上强制)。我假设Settlement不能更改,而且您只能使用Payment应用程序。

只需创建您自己的中间模型/表,并将其与支付链接。这就像拥有一个ManyToMany关系,但您可以对其强制执行约束。

代码语言:javascript
复制
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,那么从规范化的意义上看,它会执行得更好,看起来也更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25635408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档