首页 文章

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

提问于
浏览
1

你好 . 我正在努力将内部系统迁移到Django,并遇到了一些问题 .

Intro
我们当前的系统(计费系统)跟踪复式簿记,同时允许用户输入数据作为发票,费用等 .

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

  • JournalEntry

  • JournalEntryItems

定义如下:

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)

到现在为止还挺好 . 它在管理员方面非常顺利(内联工作等)

On to the next section.
然后我们又有两个模型

  • InvoiceEntry

  • InvoiceEntryItem

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-> 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-> M InvoiceEntryItems的关系 . 我看到的只是空白字段(而不是当前存储在数据库中的实际数据) .

似乎选项2更接近我想要做的事情 . 但是我对Django的经验不足似乎限制了我 . 我或许可以过滤更大的日记帐分录池以查看发票条目 . 但将这些仅仅视为发票(而不是日记帐分录的子集)真的很方便 .

关于如何做我想做的事的任何想法?

2 回答

  • 1

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

    如果您只想共享模型的成员,则可以使用Meta继承,它将在继承的模型的表中创建继承的列 . 这种方式会将您的JournalEntry分成两个表,但只检索发票很容易 .

  • 0
    • 超类中的所有字段也存在于子类中,因此不需要具有显式关系 .

    • Django中的模型继承很糟糕 . 不管怎样,不需要它 .

相关问题