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

2024-06-26 21:12:09 发布

您现在位置:Python中文网/ 问答频道 /正文

你好。我正在将一个内部系统迁移到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(这是我们在当前站点的后台使用的)。这也很顺利。在

    ^{pr2}$

    我遇到的问题是在试图将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的间接外键。在

    我正在使用代码。在

    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')
    
    1. 我已经试着删除一个单独的字段。这样做会使我无法为这个特定的InvoiceEntryItem(它只存储在journalEntryItem中)检索美元金额。

    2. 我也试过移除invoiceEntry的ForeignKey关系。这样做会删除允许我查看admin内联中InvoiceEntry 1->;M InvoiceEntryItems的关系。我看到的都是空白字段(而不是当前存储在数据库中的实际数据)。

    似乎第二种选择更接近我想要做的。但我对Django缺乏经验似乎限制了我。我可能能够过滤较大的日记账分录池,以便只看到发票分录。但将这些单独看作是发票(而不是日记账分录的一个子集)会非常方便。在

    你有什么想法吗?在


    Tags: keydbmodels系统column发票classforeignkey
    2条回答
    1. 超类中的所有字段也存在于子类中,因此没有必要使用显式关系。在
    2. Django中的模型继承非常糟糕。别用它。Python根本不需要它。在

    首先,从模型继承会在继承的模型中为父对象创建一个自动的OneToOneField,这样就不需要添加它们了。如果您真的想使用这种形式的模型继承,请删除它们。在

    如果只想共享模型的成员,可以使用元继承,它将在继承模型的表中创建继承的列。这种方法可以将日记分为两个表,但是只检索发票很容易。在

    相关问题 更多 >