Django 对象扩展/一对一关系问题

Posted

技术标签:

【中文标题】Django 对象扩展/一对一关系问题【英文标题】:Django object extension / one to one relationship issues 【发布时间】:2011-03-23 12:47:31 【问题描述】:

你好。我正在将一个内部系统迁移到 Django,但遇到了一些问题。

简介 我们当前的系统(计费系统)跟踪复式记账,同时允许用户输入发票、费用等数据。

基础对象 所以我有两个基础对象/模型:

日记条目 JournalEntryItems

定义如下:

类 JournalEntry(models.Model): gjID = models.AutoField(primary_key=True) date = models.DateTimeField('进入日期'); 备忘录 = models.CharField(max_length=100); 类 JournalEntryItem(models.Model): journalEntryID = models.AutoField(primary_key=True) gjID = models.ForeignKey(JournalEntry, db_column='gjID') 数量 = models.DecimalField(max_digits=10,decimal_places=2)

到目前为止,一切都很好。它在管理方面工作得非常顺利(内联工作等)

进入下一节。 然后我们还有两个模型

发票条目 InvoiceEntryItem

InvoiceEntry 是 / 它继承自 JournalEntry 的超集,因此我一直在使用 OneToOneField(这是我们在当前站点的后台使用的)。这也很顺利。

类 InvoiceEntry(JournalEntry): invoiceID = models.AutoField(primary_key=True, db_column='invoiceID', verbose_name='') journalEntry = models.OneToOneField(JournalEntry, parent_link=True, db_column='gjID') 客户端 = models.ForeignKey(客户端,db_column='clientID') datePaid = models.DateTimeField(null=True, db_column='datePaid', blank=True, verbose_name='datepaid')

我遇到问题的地方是尝试将 InvoiceEntryItem(继承自 JournalEntryItem)添加到与 InvoiceEntry 相关的内联中。我收到了错误:

有超过 1 个 ForeignKey 到

在我看来,InvoiceEntryItem 有一个直接指向 InvoiceEntry 的 ForeignKey。并且它还通过 JournalEntry 1->M JournalEntryItems 关系与 InvoiceEntry 有一个间接的 ForeignKey。

这是我目前正在使用的代码。

类 InvoiceEntryItem(JournalEntryItem): invoiceEntryID = models.AutoField(primary_key=True, db_column='invoiceEntryID', verbose_name='') invoiceEntry = models.ForeignKey(InvoiceEntry, related_name='invoiceEntries', db_column='invoiceID') journalEntryItem = models.OneToOneField(JournalEntryItem, db_column='journalEntryID')

    我已尝试删除 journalEntryItem OneToOneField。这样做之后,我就无法检索此特定 InvoiceEntryItem(仅存储在 journalEntryItem 中)的美元金额。

    我还尝试删除 invoiceEntry ForeignKey 关系。这样做会删除允许我在管理员内联中查看 InvoiceEntry 1->M InvoiceEntryItems 的关系。我看到的只是空白字段(而不是当前存储在数据库中的实际数据)。

似乎选项 2 更接近我想要做的。但我对 Django 的缺乏经验似乎限制了我。我也许可以过滤更大的日记帐分录池,以仅查看发票分录。但将这些仅视为发票(而不是日记帐分录的子集)会非常方便。

关于如何做我所追求的任何想法?

【问题讨论】:

【参考方案1】:

首先,从模型继承会在继承模型中向父级创建一个自动 OneToOneField,因此您无需添加它们。如果您真的想使用这种形式的模型继承,请删除它们。

如果你只想共享模型的成员,你可以使用元继承,它会在你继承的模型的表中创建继承的列。这种方式虽然会将您的 JournalEntry 分隔在 2 个表中,但很容易只检索发票。

【讨论】:

【参考方案2】:
    超类中的所有字段也存在于子类中,因此不需要明确的关系。 Django 中的模型继承很糟糕。不要使用它。 Python 无论如何都不需要它。

【讨论】:

以上是关于Django 对象扩展/一对一关系问题的主要内容,如果未能解决你的问题,请参考以下文章

Django模型:同一模型类的对象之间的一对一关系[重复]

Django - 以一对多关系更改相关对象的值

如何扩展/覆盖 UserManager

我一直在/ admin / login /获取RelatedObjectDoesNotExist。如何通过一对一关系在Django中成功创建用户配置文件?

第六模块:WEB框架开发 第1章·Django框架开发50~100

Django:遵循一对一关系的相反方向