А то, что ты в prefetch получаешь, нельзя как-нибудь прогнать через annotation? А потом уже с аннотации сортировать?
А вообще, может использовать аргумент to_attr, чтобы переименовать атрибут?
class Prefetch(lookup, queryset=None, to_attr=None)
The to_attr argument sets the result of the prefetch operation to a custom attribute.
Я так полагаю, numbers_set может ссылаться на существующее поле объекта.
Решение найдено через
FilteredRelation().
Mekalure объяснение: Собственно, Prefetch() метод не создаёт атрибут, который доступен в order_by. Я прогнал у себя: этот атрибут не доступен и в annotate. Только в результате выборки. Поэтому, отсортировать по нему не выйдет. FilteredRelation() объявляется внутри annotate и создаёт QuerySet, доступный в order_by и последующей фильтрации. Но, увы, этот QuerySet не будет доступен в результатах выборки. Подозреваю, что Джанга умеет связывать два QuerySet только через prefetch_related, но не через annotate. В любом случае, эта функция делает нужные данные доступными при сортировке.
Получается:
qs1 = Model1.objects.filter(**kwargs)
qs2 = Model2.objects.annotate(order=FilteredRelation('lookup', condition=Q(**kwarg))).prefetch_related(Prefetch('lookup', queryset=qs1)).order_by('order')