python - 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 }, ... ]
感谢所有帮助,谢谢!
解决方案
我认为您可以通过以下方式实现相同的目标:
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 对象的官方文档在这里
我会说尝试两者并比较你得到的结果。
希望有帮助。
推荐阅读
- c - 使用 void 指针在 C 中重新编程 Calloc / Realloc
- linux - Linux/Mac 上 Unity3D 项目向导项目列表存储在哪里?
- python - 删除标签冲突的行
- python - Python:使用matplotlib后的unicode问题
- php - 喜欢系统,我该如何解决?
- python-3.x - 有没有办法遍历列表以添加到硒代码中?
- node.js - AWS Lambda 工作一次,然后失败十几次
- java - 如何在java中将单个数量添加到hashmap键和值
- r - 在汇总表中显示具有零个因子实例的单元格,而不是忽略它们
- r - 需要获取 R 中列的总数