" Экземпляр "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:
Может ли кто-нибудь помочь мне определить, что может идти не так? А именно:
Есть ли проблема в том, как я обрабатываю сохранение экземпляра
BillInvoice
?Нужно ли внести какие-либо изменения в определения представления или модели, чтобы убедиться, что экземпляр
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)