Важно ответить, почему вы просматриваете медленно, основываясь на результатах таких инструментов, как профилирование и django-debug-toolbar. Трудно сказать вам, как это исправить, не зная, где замедление.
В этом случае, поскольку мы имеем дело со многими отношениями, я предполагаю, что замедление происходит из-за огромного количества запросов. Чтобы решить эту проблему, вам нужно вспомнить, сколько человек представлено в базе данных (но, похоже, вы это понимаете). Короче говоря, нет прямой связи между человеком и группой, и вместо этого в членстве есть и человек, и группа.
Это означает, что вы не можете использовать select_related, чтобы сократить количество запросов. Правильный подход сводится к запросу таблицы членства вместо таблицы Person. Правильный подход будет зависеть от особенностей вашей ситуации. Если то, что вы действительно ищете, это данные о членстве, вы можете просто набрать Membership.objects.all().select_related()
(или какой-то другой вариант). Если вы ищете людей, сделайте что-то вроде:
memberships = Membership.objects.all()
membership_dict = {}
for m in membership:
try:
membership_dict[m.person].append(m)
except KeyError:
membership_dict[m.person] = [m,]
people = Person.objects.all()
for p in people:
p.groups = membership_dict[p]
Это сократит сотни или тысячи запросов до двух запросов. Стоимость которого заключается в том, что код Python немного менее эффективен.
Имейте в виду, я просто предполагаю, что большое количество запросов является вашей проблемой, у вас могут быть другие серьезные проблемы, которые я не вижу; например, наличие индекса, интенсивный процессор Python, очень большие таблицы и т. д.