Django-如何连接两个具有不同键值的查询集(但来自同一模型)

时间:2020-06-18 14:31:27

标签: python django

我正在尝试将Django中具有不同键值的两个查询集联接在一起,但是从同一模型中,有没有办法这样做?

这是我的代码:

models.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 }, ... ]

感谢所有帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

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

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对象的官方文档是here

我会说两次尝试并比较您得到的结果。

希望有帮助。