При выполнении этого у меня около 0,7 сек с sqlite.Время сокращается на 50%, если я опускаю создание списка для каждого запроса.
Дело в том, что вы попадаете в БД столько раз, сколько у вас A
объектов.Таким образом, лучшая ставка на повышение производительности - это уменьшение количества запросов, которые вы делаете.Но здесь действительно важно, что именно вы собираетесь делать.Как это неясно, с этого момента более или менее просто нужно угадать, что может сработать для вас ...
Может быть, просто перебрать A.objects.values_list('id')
и запросить B
вместо этого, поскольку вы на самом деле не используете a
объектов:
bq = B.objects.all()
for a_id, in A.objects.values_list('id').iterator():
list(bq.filter(b__id=a_id)) # maybe correct your related_name to 'a' so this would look a__id=a_id
print(time.time() - start)
или
start = time.time()
a_ids = A.objects.values_list('id').all()
bq = B.objects.all()
[list(bq.filter(b__id=a_id)) for a_id, in a_ids]
print(time.time() - start)
Если вы просто хотите, чтобы все b
объекты были связаны с некоторыми из ваших a
объектов, скажем, например, все с name_a
содержит 'foo'
:
B.objects.filter(b__name_a__contains='foo').all().distinct()
Надеюсь, что эти предложения могут помочь