【发布时间】:2020-06-13 13:30:54
【问题描述】:
我在使用related_name 进行过滤时遇到问题。
这是我的代码: 基本上,我首先得到部门并使用它来过滤与客户信息模型具有一对多关系的 LeadSource。但是,当我运行第二个过滤器时,潜在客户的数量会突然从 2 变为 4,或从 3 变为 9(基本上我认为它自己平方,但我不知道为什么)
department = UserProfile.objects.get(user=self.request.user).department
d = department.all()[0]
qs = LeadSource.objects.filter(customers__salesDepartment = d)
print(qs)
qs = qs.filter(customers__created_date__range=(start, end)) # filtering error is from here
print(qs)
qs = qs.annotate(date=TruncMonth('customers__created_date')).values('date', 'source').annotate(count=Count('source')).order_by('date')
这是我的models.py
class CustomerInformation(models.Model):
customer_id = models.AutoField(primary_key=True)
customer_name = models.CharField(max_length=100)
salesDepartment = models.ForeignKey(SalesDepartment, blank=True, null=True, on_delete=models.CASCADE)
source = models.ForeignKey('LeadSource', related_name='customers', on_delete=models.CASCADE, null=True, blank=True)
created_date = models.DateField(default=timezone.localdate)
class LeadSource(models.Model):
source_id = models.AutoField(primary_key=True)
source = models.CharField(max_length=500)
def __str__(self):
return self.source
这是上面两个打印的输出
第一次打印:
<QuerySet [<LeadSource: Facebook>, <LeadSource: Twitter>, <LeadSource: Facebook>, <LeadSource: Instagram>, <LeadSource: Twitter>]>
第二次打印:
<QuerySet [<LeadSource: Facebook>, <LeadSource: Facebook>, <LeadSource: Twitter>, <LeadSource: Twitter>, <LeadSource: Facebook>, <LeadSource: Facebook>, <LeadSource: Twitter>, <LeadSource: Twitter>]>
这是我的最终输出(仅过滤 2020 年 6 月时):
<QuerySet [{'source': 'Facebook', 'date': datetime.date(2020, 6, 1), 'count': 4}, {'source': 'Twitter', 'date': datetime.date(2020, 6, 1), 'count': 4}]>
预期输出(仅过滤 2020 年 6 月时):
<QuerySet [{'source': 'Facebook', 'date': datetime.date(2020, 6, 1), 'count': 2}, {'source': 'Twitter', 'date': datetime.date(2020, 6, 1), 'count': 2}]>
这是我的 CustomerInformation 实例及其所需的详细信息:
ID: 1
Source: Facebook
Date: 2020-06-11
ID: 2
Source: Twitter
Date: 2020-06-12
ID: 3
Source: Facebook
Date: 2020-06-11
ID: 4
Source: Instagram
Date: 2020-01-01
ID: 5
Source: Twitter
Date: 2020-06-13
感谢所有帮助,谢谢!我真的不知道是什么导致了这个错误,但可能是因为我使用了related_name 过滤了两次?
【问题讨论】:
-
您检查过数据库中的任何数据重复吗?
-
问题是你在
customer表上做了两个JOIN,每个过滤器一个。您可能想在 same JOIN 中进行过滤? -
对不起,我是 django 的新手,但你所说的 JOIN 是什么意思?
-
@jason: 如果你对相关模型进行过滤,它会在数据库中进行 JOIN:en.wikipedia.org/wiki/Join_(SQL)
-
有没有办法让我使用两个过滤器来做到这一点?我将其拆分的原因是因为有一个 if 语句可以通过 salesDepartment 或其他字段过滤第一个查询。因此它与第二个 JOIN 分开