首页 > 解决方案 > Django - 如何连接两个具有不同键值的查询集(但来自同一模型)

问题描述

我试图在 Django 中加入两个具有不同键值的查询集,但是来自同一个模型,有什么办法吗?

这是我的代码:

模型.py

class CustomerInformation(models.Model):
    status = (
        ('lead', 'Lead'),
        ('client', 'Client'),
    )

    customer_id = models.AutoField(primary_key=True)
    customer_name = models.CharField(max_length=100)
    status = models.CharField(max_length=100, choices=status, default='lead')
    conversion_date = models.DateField(null=True, blank=True)
    created_date = models.DateField(default=timezone.localdate)


def save(self, *args, **kwargs):
        if self.customer_id:
            if self.status != CustomerInformation.objects.get(customer_id=self.customer_id).status and self.status == 'client':
                self.conversion_date = timezone.now()
            elif self.status != CustomerInformation.objects.get(customer_id=self.customer_id).status and self.status == 'lead':
                self.conversion_date = None
        super(CustomerInformation, self).save(*args, **kwargs)

这是我的过滤

start = date.today() + relativedelta(days=-30)

client_qs = CustomerInformation.objects.filter(conversion_date__gte=start).values(date=F('conversion_date')).annotate(client_count=Count('date'))
lead_qs = CustomerInformation.objects.filter(created_date__gte=start).values(date=F('created_date')).annotate(lead_count=Count('date'))

基本上我想要实现的是获取过去 30 天内创建的 CustomerInformation 实例的计数(通过注释字段“created_date”的计数)。另外,我想获取过去 30 天内已转换为“客户”状态的 CustomerInformation 实例的计数(通过注释字段“conversion_date”的计数)。有什么办法让我这样做并在单个查询集中接收它们,最好使用单个日期字段?

例如,我想要的输出是

[ {'date': '170620', 'lead_count': 2, 'client_count': 1}, {'date': '180620', 'lead_count': 1, 'client_count': 0 }, ... ]

感谢所有帮助,谢谢!

标签: pythondjango

解决方案


我认为您可以通过以下方式实现相同的目标:

combined_qs = CustomerInformation.objects.filter(created_date__gte=start, conversion_date__gte=start).annotate(lead_count=Count('created_date'), client_count=Count('conversion_date')

请注意,上面将使用AND过滤器。粗略地说,这意味着它只会返回同时具有created_dateconversion_date大于的客户信息date。(我可能错了,但我认为这就是你想要的)。

否则,您可以使用该Q对象进行更复杂的查询。

from django.db.models import Q
combined_qs = CustomerInformation.objects.filter(Q(created_date__gte=start)|Q(conversion_date__gte=start)).annotate(lead_count=Count('created_date'), client_count=Count('conversion_date')

使用 Q 对象的官方文档在这里

我会说尝试两者并比较你得到的结果。

希望有帮助。


推荐阅读