Subconsultas
deben ser consultas que no se evalúen inmediatamente para que su evaluación se pueda posponer hasta que se ejecute la consulta externa. get() no se ajusta a la factura ya que se ejecuta inmediatamente y devuelve una instancia de objeto en lugar de un Queryset .
Sin embargo, sustituyendo filter para get y luego tomando un [:1] rebanada debería funcionar:
StatByHour.objects.filter(hour_of_day=OuterRef('hour_filter')).values('hour_of_day')[:1]
Observe cómo la referencia de campo en OuterRef es un literal de cadena en lugar de una variable.
Además, las subconsultas deben devolver una sola columna y una sola fila (ya que están asignadas a un solo campo), por lo tanto, los values() y el corte de arriba.
Además, no he usado una subconsulta en una Q objeto todavía; No estoy seguro de que funcione. Es posible que primero deba guardar la salida de la subconsulta en una anotación y luego usarla para sus cálculos de filtro.