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)到目前为止,一切都很好。它在管理方面工作得非常顺利(内联工作等)
进入下一节。 然后我们还有两个模型
发票条目 InvoiceEntryItemInvoiceEntry 是 / 它继承自 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 相关的内联中。我收到了错误:
在我看来,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 对象扩展/一对一关系问题的主要内容,如果未能解决你的问题,请参考以下文章
我一直在/ admin / login /获取RelatedObjectDoesNotExist。如何通过一对一关系在Django中成功创建用户配置文件?