Django过滤多次与多次关系

时间:2016-06-24 04:11:32

标签: django orm

让我们考虑以下场景 - 多个学生可以共享书籍。

class Student(models.Model):
   books = models.ManyToManyField(Book, related_name='students')

对于特定的学生,我想找到这个学生共享/拥有的所有书籍。我做了以下事情:

s = Student.objects.get(id=1)
s.books.annotate(student_count=Count('students').filter(student_count=1)

但是,它会返回学生s的所有书籍(相当于s.books.all())。后来,我得到了以下查询所需的结果:

Book.objects.annotate(student_count=Count('students')).\
filter(students=s, student_count=1)

为什么我没有通过第一个查询得到预期的结果?

1 个答案:

答案 0 :(得分:2)

此查询集

s.books.annotate(student_count=Count('students').filter(student_count=1)

生成与

相同的SQL查询
Book.objects.filter(students=s).annotate(student_count=Count('students')).filter(student_count=1)

因为order of annotate() and filter() matters,你没有得到预期的结果(每本书的student_count等于1)。