Django: Запрос по модели с несколькими таблицами
Я попробовал это на объекте Q и в Django ORM, но не смог сгенерировать запрос.
class Status(models.Model):
id = models.AutoField(primary_key=True)
name = models.AutoField(null=True, max_length=100)
def __str__(self):
return self.name
class Billing(models.Model):
id = models.AutoField(primary_key=True)
name = models.AutoField(null=True, max_length=1000)
sr_number = models.AutoField(null=True, max_length=100)
def __str__(self):
return self.name
class BillingInfo(models.Model):
id = models.AutoField(primary_key=True)
billings = models.ForeignKey(Billing, null=True, on_delete=models.SET_NULL)
net_amount = models.AutoField(null=True, max_length=100)
company = models.AutoField(null=True, max_length=100)
def __str__(self):
return self.company
class BillingOutput(models.Model):
id = models.AutoField(primary_key=True)
billing_infos = models.ForeignKey(BillingInfo, null=True, on_delete=models.SET_NULL)
lbl_name = models.AutoField(null=True, max_length=100)
lbl_qty = models.AutoField(null=True, max_length=100)
status = models.ForeignKey(Status, null=True, on_delete=models.SET_NULL)
def __str__(self):
return self.lbl_name
Мне потребовался эквивалентный запрос ORM для приведенного ниже необработанного SQL-запроса:
select bio.* from billing bil
inner join billing_infos bi on bil.id = bi.billings_id
inner join billing_output bio on bi.id = bio.billing_infos_id
where bo.status_id = 1
order by bio.id desc;
Мог бы кто-нибудь помочь мне с этой проблемой?
Вы можете использовать .select_related(…) [Django-doc] для получения связанных billing_infos и billing с этим billing_infos:
BillingOutput.objects.select_related(
'billing_infos__billing'
).filter(status_id=1, billing_infos__billing__isnull=False).order_by('-id')
Note: Django will add by default an
AutoField[Django-doc] asprimary_key=Trueto a model with nameidif you do not specify a primary key yourself, so there is no need to explicitly declare a primary key.
На самом деле вы можете сделать это :
qry1 = "select bio.* from billing bil
inner join billing_infos bi on bil.id = bi.billings_id
inner join billing_output bio on bi.id = bio.billing_infos_id
where bo.status_id = 1
order by bio.id desc;"
bio = Billing.objects.raw(qry1 , [user_id])