django:连接两个没有外键的表

Posted

技术标签:

【中文标题】django:连接两个没有外键的表【英文标题】:django: join two tables without foreignkey 【发布时间】:2020-12-05 05:53:05 【问题描述】:

我有两个想要加入的模型,但它们没有任何外键

class Invoice(models.Model):
    invoice_id                      = models.IntegerField(blank=True, null=True)
    quotation_id                    = models.IntegerField(blank=True, null=True)
    client_id                       = models.ForeignKey(tbl_customer, on_delete=models.CASCADE)
    invoice_number                  = models.IntegerField(blank=True, null=True)
    quotation_number                = models.IntegerField(blank=True, null=True)
    date                            = models.DateField(blank=True, null=True)
    total_amount                    = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True)
    total_tax                       = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True)
    document_type                   = models.CharField(max_length=50, default='', blank=True, null=True)

class Invoice_Description(models.Model):
    invoice_id                      = models.IntegerField(blank=True, null=True)
    client_id                       = models.ForeignKey(tbl_customer, on_delete=models.CASCADE)
    quotation_id                    = models.IntegerField(blank=True, null=True)
    item_id                         = models.ForeignKey(tbl_item, on_delete=models.CASCADE)
    item_qty                        = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True)
    item_unit_price                 = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True)

Invoice 包含有关发票文档、其总价、日期等的信息,而Invoice_Description 保留在该特定发票上添加的项目、项目价格、总数量、每个项目的折扣等的记录。

我想在报告中显示与类似项目相关的所有记录

ITEM NAME   CUSTOMER NAME   INV. NO.    QTY    DOCUMENT TYPE    UNIT PRICE    SALE PRICE
Item1            Client1                 01                        950.00        1000.00

除了Invoice 模型中的INV. NO.DOCUMENT TYPE 之外,我拥有来自Invoice_Description 的所有列。

我不想在这种情况下使用 ForeignKey,因为这些模型已经在许多地方使用,更改数据库将需要在任何地方进行更改。

我的问题是我想在 Django 中加入两个模型但没有 ForeignKey 以便我可以获得相应行的 Invoice No. 和 Document Type。

关于如何做到这一点的任何想法?

【问题讨论】:

【参考方案1】:

如果您只想检索属于给定InvoiceInvoiceDescription 对象,您可以执行以下操作:

invoice = Invoice.objects.first()
try:
    description = InvoiceDescription.objects.get(invoice_id=invoice.invoice_id)
except InvoiceDescription.DoesNotExist:
    description = None

我假设字段 invoice_id 指的是发票 ID。尽管您没有使用 models.ForeignKey 声明它,但在这种情况下它仍然充当外键。您只需手动进行查找。

【讨论】:

一个查询将是两个数据库命中!?!...顺便说一句,我通过在Invoice_Description 中声明Foreignkey 解决了这个问题,我想加入表格,models.Foreignkey 是最多的在 Django 中这样做很方便...:D

以上是关于django:连接两个没有外键的表的主要内容,如果未能解决你的问题,请参考以下文章

从没有外键的两个模型的 JOIN 中检索值(Django)

在没有外键的情况下连接与 RestKit 的关系

基于唯一键的Django加盟模式

多表操作

实体框架代码优先:具有两个外键的表

如何从具有两个外键的表中访问列?