Django细分查询集最有效的方法是什么?

Django细分查询集最有效的方法是什么?,django,Django,既然每个查询集都是,那么在循环中不生成太多sql查询的情况下对大型查询集进行子集设置的最佳方法是什么 例如,我需要生成一个报告,该报告要求我遍历数据库中的所有数据: for user in users: notes = Note.objects.filter(owner=user.id) for note in notes: answers = Answer.filter(note_id = note.id) for answer in answe

既然每个查询集都是,那么在循环中不生成太多sql查询的情况下对大型查询集进行子集设置的最佳方法是什么

例如,我需要生成一个报告,该报告要求我遍历数据库中的所有数据:

for user in users:
    notes = Note.objects.filter(owner=user.id)
    for note in notes:
        answers = Answer.filter(note_id = note.id)
        for answer in answers:
            #do something
正如您已经看到的,由于每个filter语句都会创建一个命中数据库的queryset,所以这个循环会有多糟糕

在这种情况下,我应该怎么做才能避免数千次调用数据库

谢谢

试试这个

answer = Answer.objects.filter(note__owner__in = user_ids)

如果
users
为QuerySet,则

answers = Answer.objects.filter(note__owner__in=users)
更新:如果你想用
答案
注释
所有者
做点什么,那么

answers = Answer.objects.filter(note__owner__in=users).select_related('note', 'note__owner')

它需要一个查询。

如果您需要遍历每个答案,为什么需要按注释进行筛选?为什么不直接通过Answer.objects.all()?因为我没有将答案模型与用户模型链接,这意味着我不知道哪个答案属于哪个用户。但我确实将答案与注释和注释与用户进行了链接。通过这种方法,数据库点击量会随着用户数量的增加而增加。我想知道是否有一种更有效的方法可以做到这一点,而不必在循环中创建任何查询集。可能会将包含所有信息的查询集转换为字典并在字典中循环。我将进行编辑,假设您从ID列表开始。如果您想要所有用户,则无需进行筛选。请选择“相关”(“备注”,“备注”\u所有者”)解决了@f43d65建议的问题,但感谢您的帮助!是的,用户是一个查询集。下面的答案请看我的评论。