Django细分查询集最有效的方法是什么?
既然每个查询集都是,那么在循环中不生成太多sql查询的情况下对大型查询集进行子集设置的最佳方法是什么 例如,我需要生成一个报告,该报告要求我遍历数据库中的所有数据: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
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建议的问题,但感谢您的帮助!是的,用户是一个查询集。下面的答案请看我的评论。