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

     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)

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

0
Shanzedul 3 Фев 2022 в 20:50
Инвойс должен быть моделью, используйте его как внешний ключ из обеих других моделей. Или, если ваш счет-фактура является счетом-фактурой, платеж должен иметь к нему внешний ключ.
 – 
Henty
3 Фев 2022 в 20:51
Потратьте немного времени на изучение документации, в частности запросы. Поиски.
 – 
Adrian Klaver
3 Фев 2022 в 20:53

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}}

0
LaCharcaSoftware 3 Фев 2022 в 21:02
Это не контролирует отношение на уровне базы данных. Кроме того, вы явно кодируете вещи, которые Django предлагает уже встроенными. Если вы решили использовать Django — почему бы не получить от этого прибыль?
 – 
Risadinha
3 Фев 2022 в 21:11
Вы абсолютно правы. Но я понял, что Шанзедул почему-то не хочет использовать внешние ключи.
 – 
LaCharcaSoftware
3 Фев 2022 в 21:20

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

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