Получить кверисет связанных полей один к одному
У меня есть 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