我正在尝试将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 }, ... ]
感谢所有帮助,谢谢!
答案 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_date
和conversion_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
我会说两次尝试并比较您得到的结果。
希望有帮助。