使用Django的ORM,我有一个简单的Question和Topic模型,如下所示:
class Topic(models.Model):
name = models.CharField(max_length=200)
class Question(models.Model):
topic_items = models.ManyToManyField(Topic, blank=True)
date_asked = models.DateField()
假设我有四个问题分别在不同的日期提出,第四个问题共享两个主题“ topic1”,“ topic2”
如果我对topic_restrict进行以下查询,请限制“ topic1”和“ topic2”的两个主题ID的列表...
q_filter = Question.objects.filter(topic_items__in=topics_restrict).distinct()
然后我得到4个结果(而不是5个,如果没有不同的结果就可以得到)
现在,如果我执行以下操作:
return q_filter.annotate(
total=Count('date_asked')
).values_list('total', flat=True)
我得到的结果是[2,1,1,1]而不是[1,1,1,1]-也就是说,就好像从未应用了distinct()。
解决这个问题的唯一方法是...
q_filter = Question.objects.filter(pk__in=q_filter.values_list('pk', flat=True))
...然后在该q_filter上进行注释。
但是必须有更好的方法吗?