Od pewnego czasu masz dwie warstwy kompatybilności pozwalające pisać kod działający i na Py 2.7 i Py 3.4. Wystarczy na początku pliku importować:
from __future__ import unicode_literals
aby interpreter 2.7 używał składni stringów wprowadzonej w 3 wersji. Ofc. wymagać to będzie przelecenia kodu i pokasowania "u" z przed stringów.
W 3k było też kilka zmian w zachowaniach metod niektórych typów (np. funkcje zwracające listy stały się generatorami), co jednak poza pewnymi przypadkami nie powinno powodować problemów, a i w przypadku problemów jest łatwe do wyłowienia i pofixowania (bo przecież masz automatyczne testy które to wyłowią, prawada?).
Niektóre moduły zostały przemianowane (vide "urlparse" żyje teraz jako "parse" pod "urllib", "StringIO.StringIO" to teraz "io.StringIO") w py3k, ale tutaj wkracza biblioteka SIX będąca drugą warstwą kompatybilności. Import "from six.move.io import StringIO" zaimportuje StringIO na py3k i py 2.7, a kiedy wycofasz się z py2, wystarczy zrobić masowy replace usuwający "six.mode." (chyba że będziesz mieć kolizje nazw).
Django używa __future__ i six do działania w obu majorach pythona.