Django中的多个联接

时间:2018-10-25 10:30:18

标签: python sql postgresql django-1.8

我正在尝试将以下SQL查询转换为Django ORM,但无法执行此操作。

SQL查询

select distinct(cch.campaign_contact_id), cc.lead_status, cc.contact_id, c.*, ls.date, ls.token from campaign_contact_history as cch left join campaign_contacts as cc on cc.id=cch.campaign_contact_id left join contacts as c on c.id=cc.contact_id left join leadsummary as ls on ls.contact_id=c.id where cc.lead_status in ('8', '9') and cch.created_at between '2018-01-01' and '2018-10-20';

以下是上述查询在SQL上下文中的解释:

它将从Contact模型中获取所有列,从CampaignContact模型即lead_status中获取一列,并从LeadSummary模型中,即date中获取一列。 基于CampaignContactHistory模型,过滤器必须适用于created_at范围和distinct campaign_contact

以下是上述查询在ORM上下文中所做的解释:
基于CampaignContactHistory模型,我希望来自Contact以及来自CampaignContactLeadSummary的所有对象。它将使用created_atCampaignContactHistory对象上的distinct()在campaign_contact上的CampaignContactHistory上应用过滤器。

以下是定义的模型:

class CampaignContactHistory(DateAwareModel):  # campaign_contact_history
    campaign_contact = models.ForeignKey(CampaignContact, on_delete=models.CASCADE)
    lead_status = models.CharField(max_length=20)

class CampaignContact(DateAwareModel):  # campaign_contacts
    contact = models.ForeignKey(Contact, on_delete=models.CASCADE)
    lead_status = models.CharField(max_length=20)

class Contact(DateAwareModel):  # contacts
    id = models.AutoField(primary_key=True)
    contact_UID = models.CharField(max_length=20)
    ...

class LeadSummary(DateAwareModel):  # leadsummary
    contact = models.ForeignKey(Contact, on_delete=models.CASCADE)
    date = models.DateField(null=True, blank=True)

我在SQL查询中使用的表名被写为每个类模型的注释。

请帮助我解决此问题。另外,如果有人可以建议我改善SQL Query,那会更好。 预先感谢。

0 个答案:

没有答案