Django对查询集进行子集化的最有效方法是什么?

时间:2015-06-09 08:38:52

标签: django

由于每个查询集都是unique,因此在循环中生成太多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语句都会创建一个命中数据库的查询集。

在这种情况下我想做些什么来避免数千次调用数据库?

谢谢!

2 个答案:

答案 0 :(得分:1)

试试这个

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

答案 1 :(得分:1)

如果users是QuerySet,那么

answers = Answer.objects.filter(note__owner__in=users)

更新:如果您想对Answer noteowner执行某些操作,那么

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

它需要一个查询。