使用Django将多对多过滤器结合起来并添加注释和注释

时间:2018-06-19 17:02:38

标签: django many-to-many distinct annotate

使用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上进行注释。

但是必须有更好的方法吗?

0 个答案:

没有答案