Как я могу объединить две модели в 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}}
Измените свои модели, а именно:
SalesInvoice.invoiceбыть уникальным. Если вы не можете гарантировать, что это значение будет уникальным - подумайте еще раз о связях вашей модели и данных. .
- сделайте
SalesPayment.invoiceполеForeignKeyдляSalesInvoice. Прочитайте о том, что делает on_delete=PROTECT и какие еще есть варианты: https://docs.djangoproject.com/en/4.0/ref/models/fields/#foreignkey .
- вам не нужно явно добавлять
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