Получить кверисет связанных полей один к одному

У меня есть 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

Вернуться на верх