Как я могу объединить две модели в django

Я хочу объединить две модели. Я использую postgresql. Но проблема в том, что я не использую никаких внешних ключей или многих полей. Но я использую одно и то же уникальное поле для обеих таблиц. Поэтому я хочу, чтобы в зависимости от этого поля я мог запрашивать данные из обеих таблиц. Таким полем является "счет-фактура". Мои модели

     class Salesinvoice(models.Model):
           id = models.AutoField(primary_key=True)
           date = models.DateField(default=date.today)
           invoice = models.CharField(max_length=20)
           customer = models.CharField(max_length=100)
           product_name = models.CharField(max_length=80)
           price = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
           quantity = models.IntegerField(default=0)
   



    class Salespayment(models.Model):
         id = models.AutoField(primary_key=True)
         date = models.DateField(default=date.today)
         invoice = models.CharField(max_length=20)
         amount = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
         discount = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
         payment = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)

Какими должны быть мои представления для объединения вышеуказанных двух таблиц в зависимости от поля счета-фактуры.

Например, добавьте функцию в класс Salesinvoice:

class Salesinvoice(models.Model):
 id = models.AutoField(primary_key=True)
 ....
 quantity = models.IntegerField(default=0)
 def payment(self):
  if Salespayment.objects.filter(invoice = self.invoice).count() == 1:
   return Salespayment.objects.get(invoice = self.invoice)
  else:
   return None

Итак, когда вам понадобится связанный Salespayment в вашем views.py, просто сделайте:

salesinvoice = Salesinvoice.objects.get(...)
salespayment = salesinvoice.payment()

То же самое в шаблонах:

{{salesinvoice.payment.anyfield}}

Измените свои модели, а именно:

  1. SalesInvoice.invoice быть уникальным. Если вы не можете гарантировать, что это значение будет уникальным - подумайте еще раз о связях вашей модели и данных.
  2. .
  3. сделайте SalesPayment.invoice поле ForeignKey для SalesInvoice. Прочитайте о том, что делает on_delete=PROTECT и какие еще есть варианты: https://docs.djangoproject.com/en/4.0/ref/models/fields/#foreignkey
  4. .
  5. вам не нужно явно добавлять id поля. Это все равно делается Django.
class SalesInvoice(models.Model):
    date = models.DateField(default=date.today)
    invoice = models.CharField(max_length=20, unique=True) # changed
    customer = models.CharField(max_length=100)
    product_name = models.CharField(max_length=80)
    price = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
    quantity = models.IntegerField(default=0)
   

class SalesPayment(models.Model):
    date = models.DateField(default=date.today)
    invoice = models.ForeignKey(SalesInvoice, on_delete=PROTECT)  # changed
    amount = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
    discount = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
    payment = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)

Django будет автоматически поддерживать следующие виды поиска и многое другое:

# get all payments for an invoice (could be empty)
payments = salesInvoice.salespayment_set.all()  # this is a queryset

# get the invoice of a specific payment by date of a customer
payment = SalesPayment.objects.filter(customer=cust_pk, date=some_date).first()
if payment:
    invoice = payment.invoice.invoice # this is your identifying string
Вернуться на верх