Stworzyłem aplikację django-cities-teryt dostarczającą modele, integrację z adminem oraz komendy potrzebne zaimportować dane dla polskich regionów i miast w Django.

Dane pobierane są z bazy danych TERYT prowadzoną przez Główny Urząd Statystyczny.

Zawartość bazy:

  • województwa
  • powiaty
  • gminy
  • wsie
  • miasta
  • dzielnice

Instalacja

Z PyPI

pip install django-cities-teryt

lub wersja developerska

pip install -e git+git@github.com:lukaszbanasiak/django-cities-teryt.git#egg=cities_teryt

Dodanie cities_teryt do INSTALLED_APPS

INSTALLED_APPS = (
    ...
    'cities_teryt',
)

Teraz uruchom syncdb aby stworzyć tabele dla modeli

Konfiguracja

  1. Ściągnij pliki xml SIMC oraz TERC ze strony TERYT http://www.stat.gov.pl/broker/access/prefile/listPreFiles.jspa oraz zapisz w katalogu projektu
  2. Wskaż w settings.py pełną ścieżkę do powyższego katalogu
# Default directory is `import` dir in `django-cities-teryt` app directory
 CITIES_TERYT_IMPORT_DIR = '/path/to/dir'

Importowanie danych

Aby wypełnić bazę danymi TERYT używamy komendy

./manage.py cities_teryt --data all --import

Usunięcie danych

./manage.py cities_teryt --data all --flush

Jeśli chcemy zaimportować (usunąć) dany typ informacji możemy je wymienić po argumencie --data

./manage.py cities_teryt --data province, county, municipality --import
 ./manage.py cities_teryt --data city, village, district --flush

Uwaga

Dane posiadają relacje więc najlepiej zaimportować wszystko. Danych jest dużo więc potrzeba czasu aby je zaimportować (postęp nie jest wyświetlany).  „Gadatliwość” jest kontrolowana poprzez LOGGING.

Przykłady

Pobranie miasta po nazwie

>>> City.objects.get(name='Swarzędz')
<City: Swarzędz (0971502)>

Pobranie gminy w jakiej znajduje się miasto. Możemy użyć atrybutu parent albo wywołać bezpośrednio municipality

>>> City.objects.get(name='Swarzędz').parent
<Municipality: Swarzędz (302116)>
>>> City.objects.get(name='Swarzędz').municipality
<Municipality: Buk (302103)>
>>> Municipality.objects.get(city__name='Swarzędz')
<Municipality: Swarzędz (302116)>

Pobranie wszystkich dzielnic danego miasta

>>> c = City.objects.get(name='Swarzędz')
>>> c.district_set.all()
[<District: Nowa Wieś (0971519)>, <District: Zieleniec (0971525)>]
>>> District.objects.filter(city=c)
[<District: Nowa Wieś (0971519)>, <District: Zieleniec (0971525)>]

Wyświetlanie „przyjaznych” nazw w formacie Wieś, Gmina, Powiat, Województwo

>>> print Village.objects.get(name='Kaczkowo', province__name='wielkopolskie').get_display_name()
Kaczkowo, Rydzyna, leszczyński, wielkopolskie

Gmina i powiat dla miasta Poznań jest o takiej samejnazwie więc wyświetla się tylko nazwa miasta oraz województwa

>>> print City.objects.get(name='Poznań').get_display_name()
Poznań, wielkopolskie

Więcej przykładów do znalezienia na githubie: https://github.com/lukaszbanasiak/django-cities-teryt