Получить кверисет связанных полей один к одному
У меня есть 3 модели:
class BillingNumbering(models.Model):
number = models.IntegerField()
date = models.DateField(default=now)
class Invoice(models.Model):
number = models.OneToOneField(BillingNumbering, on_delete=models.PROTECT)
created_at = models.DateTimeField(auto_now_add=True,
null=True, blank=True)
class DamageClaim(models.Model):
number = models.OneToOneField(BillingNumbering, on_delete=models.PROTECT)
created_at = models.DateTimeField(auto_now_add=True,
null=True, blank=True)
Я хочу запросить только те BillingNumbering объекты, которые связаны либо с Invoice, либо с DamageClaim.
Так что если у меня
<BillingNumbering: 1>- связано со счетом-фактурой<BillingNumbering: 2>- связано с заявлением о возмещении ущерба<BillingNumbering: 3>- подключен к None, гдеinstance.invoiceилиinstance.damageclaimприведет кObjectDoesNotExistошибке.
Тогда я хочу вернуть только <BillingNumbering: 1> и <BillingNumbering: 2> с BillingNumbering фильтром
Вы можете добавить поле related_name как в Invoice, так и в DamageClaim
class Invoice(models.Model):
number = models.OneToOneField(
BillingNumbering,
on_delete=models.PROTECT,
related_name="invoice_billing_number",
)
created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True)
class DamageClaim(models.Model):
number = models.OneToOneField(
BillingNumbering,
on_delete=models.PROTECT,
related_name="damageclaim_billing_number",
)
created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True)
Затем вы должны иметь возможность запросить объекты биллинга, связанные с Invoices и DamageClaims, соответственно - примерно так:
invoice_billing = BillingNumbering.objects.values_list("invoice_billing_number")
damageclaim_billing = BillingNumbering.objects.values_list("damageclaim_billing_number")
Думаю, это то, что вы ищете.
qs = BillingNumbering.objects.prefetch_related('invoice_set', 'demageclaim_set')
Если вам интересно, откуда я беру invoice_set и demageclaim_set, это имена по умолчанию, которые Django дает в том случае, если вы не указали никаких related_name в ваших ForeignKey или других полях отношения. ссылка на документацию для более подробной информации о related_name