你好。我正在努力将一个内部系统迁移到Django并且遇到了一些问题。
简介
我们当前的系统(计费系统)跟踪复式簿记,同时允许用户输入数据作为发票,费用等。
基础对象
所以我有两个基础对象/模型:
定义如下:
class JournalEntry(models.Model): gjID = models.AutoField(primary_key=True) date = models.DateTimeField('entry date'); memo = models.CharField(max_length=100); class JournalEntryItem(models.Model): journalEntryID = models.AutoField(primary_key=True) gjID = models.ForeignKey(JournalEntry, db_column='gjID') amount = models.DecimalField(max_digits=10,decimal_places=2)
到目前为止,这么好。它在管理员方面非常顺利(内联工作等)
转到下一部分。
然后我们又有两个模型
InvoiceEntry是/它继承自JournalEntry的超集,所以我一直在使用OneToOneField(这是我们在当前网站的后台使用的)。这也很顺利。
class InvoiceEntry(JournalEntry): invoiceID = models.AutoField(primary_key=True, db_column='invoiceID', verbose_name='') journalEntry = models.OneToOneField(JournalEntry, parent_link=True, db_column='gjID') client = models.ForeignKey(Client, db_column='clientID') datePaid = models.DateTimeField(null=True, db_column='datePaid', blank=True, verbose_name='date paid')
我遇到问题的地方是尝试将InvoiceEntryItem(继承自JournalEntryItem)添加到与InvoiceEntry相关的内联中。我收到了错误:
<class 'billing.models.InvoiceEntryItem'> has more than 1 ForeignKey to <class 'billing.models.InvoiceEntry'>
我看到它的方式,InvoiceEntryItem有一个ForeignKey直接到InvoiceEntry。它还通过JournalEntry 1-&gt; M JournalEntryItems关系对InvoiceEntry有间接的ForeignKey。
这是我目前正在使用的代码。
class 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关系。这样做会删除允许我在admin内联中查看InvoiceEntry 1-&gt; M InvoiceEntryItems的关系。我看到的只是空白字段(而不是当前存储在数据库中的实际数据)。
似乎选项2更接近我想要做的事情。但是我对Django的经验不足似乎限制了我。我可能能够过滤更大的日记帐分录池以查看发票条目。但将这些仅仅视为发票(而不是日记帐分录的子集)非常方便。
关于如何做我想做的事的任何想法?
答案 0 :(得分:1)
首先,继承自模型会在继承的模型中为父项创建一个自动OneToOneField,因此您无需添加它们。如果你真的想使用这种形式的模型继承,请删除它们。
如果您只想共享模型的成员,可以使用Meta继承,它将在您继承的模型的表中创建继承的列。这种方式会将您的JournalEntry分成两个表,但只检索发票很容易。
答案 1 :(得分:0)