difference()
переводится в предложение EXCEPT
, синтаксис которого зависит от серверной части базы данных.
Для SQLite Django выдает ошибку при использовании упорядоченных наборов запросов по обе стороны от difference()
.
Для Postgres упорядочение подзапросов разрешено, но оно влияет только на подзапросы (что имеет смысл, однако, только когда подзапрос разделен).
В обоих бэкэндах, чтобы упорядочить результирующий запрос, необходимо добавить явный .order_by(...)
к результирующему набору запросов:
q3 = q1.difference(q2).order_by('name')
Что касается вашего последнего вопроса, вот документы для difference
. Функция возвращает набор запросов, содержащий элементы в одном наборе запросов минус элементы в одном или нескольких других наборах запросов. Порядок здесь не имеет прямого отношения.