我正在尝试将以下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
以及来自CampaignContact
,LeadSummary
的所有对象。它将使用created_at
中CampaignContactHistory
对象上的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
,那会更好。
预先感谢。