Они должны быть полностью эквивалентны. Под капотом Django оптимизирует оба из них для запроса подзапроса в SQL. Смотрите QuerySet API reference on in
:
Это QuerySet будет оцениваться как подвыборки заявление:
SELECT ... WHERE consumer.id IN (SELECT id FROM ... WHERE _ IN _)
Однако вы можете заставить поиск, основанный на переходе в явных значений первичных ключей, вызвав list
на вашем values_list
, например, так:
providers_ids = list(Provider.objects.filter(age__gt=10).values_list('id', flat=True))
consumers = Consumer.objects.filter(consumer__in=providers_ids)
Это может быть более производительным в некоторых случаях, например, когда у вас есть несколько поставщиков, но это будет полностью зависеть от того, что ваши данные, как и то, что база данных вы используете. См. Примечание «Рекомендации по производительности» в приведенной выше ссылке.