让我们考虑以下场景 - 多个学生可以共享书籍。
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)
为什么我没有通过第一个查询得到预期的结果?
答案 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)。