" Экземпляр "BillInvoice" должен иметь значение первичного ключа, прежде чем можно будет использовать это отношение" Ошибка

У меня возникла проблема с проектом Django, в котором я пытаюсь создать BillInvoice и связанные с ним BillLineItem экземпляры. Ошибка, с которой я сталкиваюсь, выглядит следующим образом:

"'BillInvoice' instance needs to have a primary key value before this relationship can be used"

Контекст:

У меня есть представление формы (CreateInvoiceView), которое обрабатывает создание счетов-фактур и их элементов с помощью набора форм. Соответствующие части моего кода выглядят следующим образом:

Это мой model.py

Профиль пользователя

class UserProfile(models.Model):
    ROLE = [
        ('Select Role', 'Select Role'),
        ('Admin', 'Admin'),
        ('CBUMT', 'CBUMT'),
        ('Pharmacist', 'Pharmacist'),
        ('Doctor', 'Doctor'),
        ('Nurse', 'Nurse'),
        ('Referral Provider', 'Referral Provider'),
        ('Member', 'Memeber'),
        ('Dependent', 'Dependent'),
    ]

    GENDER = [
        ('None', 'None'),
        ('Male', 'Male'),
        ('Female', 'Female'),
        
    ]
    
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    id_number = models.CharField(max_length=30, blank=True, null=True)
    is_medical_staff = models.BooleanField(default=False)
    role = models.CharField(max_length=50, choices=ROLE, default='CBUMT')
    gender = models.CharField(max_length=20, choices=GENDER, default='None')
    date_of_birth = models.DateField(blank= False, null=False, default=timezone.now)
    phone = models.CharField(max_length=20, blank=True, null=True)
    qualification = models.CharField(max_length=100, blank=True, null=True)
    bio = models.TextField(blank=True, null=True)
    profile_pic = models.ImageField(null=True, blank=True, upload_to='images/', default='img/placeholder.jpg')

    @property
    def age(self):
        today = date.today()
        age = today.year - self.date_of_birth.year - ((today.month, today.day) < (self.date_of_birth.month, self.date_of_birth.day))
        return age

    def __str__(self):
        return str(self.user) + ' | ' + self.role
**BillInvoice**
class BillInvoice(models.Model):
    TYPE_CHOICES = [
        ('Medicine', 'Medicine'),
        ('Auxillary', 'Auxillary'),
        ('Mixed', 'Mixed'),
    ]
    patient = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name='invoices', null=True)
    invoice_type = models.CharField(max_length=50, choices=TYPE_CHOICES, default='Medicine')
    reference = models.ForeignKey(Referral, on_delete=models.CASCADE, related_name='invoice_references', null=True)
    amount = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    date = models.DateField(auto_now_add=True)
    due_date = models.DateField(null=True, blank=True)
    status = models.BooleanField(default=False)
    prepared_by = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name='prepared_invoices', null=True, blank=True)

    def __str__(self):
        return f'Invoice for {self.patient} on {self.date}'
    
    def update_amount(self):
        total_amount = sum(item.amount for item in self.lineitems.all())
        self.amount = total_amount

    def get_status(self):
        return self.status

    def save(self, *args, **kwargs):
        if not self.id and not self.due_date:
            self.due_date = datetime.now() + timedelta(days=30)
        self.update_amount()  # Update the amount before saving
        super().save(*args, **kwargs)

BillLineItem

class BillLineItem(models.Model):
    patient = models.ForeignKey(BillInvoice, on_delete=models.CASCADE, related_name='lineitems')
    service = models.TextField()
    description = models.TextField()
    quantity = models.IntegerField()
    rate = models.DecimalField(max_digits=9, decimal_places=2)
    amount = models.DecimalField(max_digits=9, decimal_places=2)

    def __str__(self):
        return str(self.patient)

M views.py

CreateInvoiceView

Подробности ошибки:

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

Request:

Может ли кто-нибудь помочь мне определить, что может идти не так? А именно:

  1. Есть ли проблема в том, как я обрабатываю сохранение экземпляра BillInvoice?

  2. Нужно ли внести какие-либо изменения в определения представления или модели, чтобы убедиться, что экземпляр BillInvoice сохраняется с первичным ключом перед ассоциацией экземпляров BillLineItem?

Что я пробовал:

Сохранение счета-фактуры сразу: Я убедился, что сохранил экземпляр BillInvoice сразу после его создания, поэтому ему назначается первичный ключ, прежде чем пытаться создать любые экземпляры BillLineItem. Это должно гарантировать, что invoice будет иметь идентификатор, когда на него будут ссылаться элементы строки.

CreateInvoiceView

Я столкнулся с той же проблемой, и решение, которое я смог реализовать, заключается в сохранении экземпляра при инициировании формы создания вида. Я использую Wagtail, так что это немного отличается от Django, но я думаю, что вы можете сделать то же самое при инициировании формы. Вот пример кода:

class CreateInvoiceView(FormView):

    def __init__(self, *args: list, **kwargs: dict) -> None:
        if not kwargs["instance"].pk:
            invoice = kwargs["instance"]
            invoice.save()
        super().__init__(*args, **kwargs)
Вернуться на верх