django: объединить две таблицы без foreignkey

#django #django-models #orm

#django #django-модели #orm

Вопрос:

У меня есть две модели, к которым я хочу присоединиться, но у них нет никакого внешнего ключа

 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_Description , за исключением INV. NO. и DOCUMENT TYPE , которые находятся в Invoice модели.

Я не хочу использовать ForeignKey в этом случае, потому что эти модели уже используются во многих местах, изменение базы данных потребует изменений везде.

моя проблема заключается только в том, что я хочу объединить две модели в Django, но без ForeignKey, чтобы я мог получить номер счета и тип документа соответствующей строки.

Есть какие-нибудь идеи о том, как я могу это сделать??

Ответ №1:

Если все, что вы хотите сделать, это получить InvoiceDescription объект, который принадлежит данному Invoice , вы можете сделать следующее:

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

Я предполагаю, что поле invoice_id ссылается на идентификатор счета. Хотя вы не объявляли его с помощью models.ForeignKey , в этой ситуации он по-прежнему действует как внешний ключ. Вам просто нужно выполнить поиск вручную.

Комментарии:

1. это будет два обращения к базе данных для одного запроса !?!… кстати, я решил эту проблему, объявив Foreignkey Invoice_Description , что я хотел объединить таблицы, и models.Foreignkey это наиболее удобно делать в Django …: D