Я хочу присоединиться к двум моделям. Я использую постгрескл. Но проблема в том, что я не использую внешний ключ или многие поля. Но я использую одно и то же уникальное поле для обеих таблиц. Итак, я хочу, чтобы это поле зависело от того, что я могу запросить из обеих таблиц. "счет" - это поле. Мои модели
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)
Какими должны быть мои представления для объединения над обеими таблицами, зависит от поля счета.
2 ответа
Например, добавьте функцию в класс 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
Похожие вопросы
Новые вопросы
django
Django - это серверная платформа веб-приложений с открытым исходным кодом, написанная на Python. Он разработан для сокращения усилий, необходимых для создания сложных веб-сайтов и веб-приложений, управляемых данными, с особым упором на меньшее количество кода, отсутствие избыточности и более явное, чем неявное.