Países y ciudades del mundo en nuestros proyectos Django

imagen / PixaBay
  
17 de Mayo de 2019   0  

En varias ocasiones he estado involucrado en el desarrollo de plataformas web que requieren la integración de datos geográficos para presentarlos en formato de listas en cascada en un registro de usuarios (por decir un ejemplo) y que se necesite seleccionar País, luego que la info se filtro y me presente sus estados(región), y luego que me muestre sus municipio (subregion) y así continúa el flujo.

Como es un comportamiento muy común y frecuente en este tipo de proyectos, hemos decidido presentarles hoy una librería que seguramente les servirá de mucho para agilizar la construcción de este tipo de funcionalidad, esta librería se llama: "django-cities".

 

¿Qué es django-cities?

Es una app que nos proporciona modelos relacionados para representar lugares (por ejemplo, país, región, ciudad) y datos (de GeoNames) que se pueden usar en nuestros proyectos escritos en Django.

Este paquete admite oficialmente todas las versiones actualmente compatibles de Python / Django:

¿Cómo se instala?

Requerimiento previo: La base de datos que utilices debe admitir consultas espaciales, consulta la documentación de GeoDjango para obtener detalles e instrucciones de configuración.

Muy fácil, utilizando PIP: 

pip install django-cities

Una vez instalado se debe integrar a la lista INSTALLED_APPS de settings.py: 

INSTALLED_APPS = (
    # ...
    'cities',
    # ...
)

Como esta librería genera tablas en nuestra base de datos para almacenar la info de los lugares, es necesario ejecutar las migraciones de la app: 

python manage.py migrate cities

Esto nos dará como resultado las siguientes tablas: 

 

Y en el admin de Django lo podremos encontrar de la siguiente manera: 

Precargar datos en las tablas.

La librería django-cities viene con una funciones que nos permite cargar información geoespacial desde GeoNames y evitar comenzar desde 0 cargando uno por uno los datos. Para ello se requiere ejecutar los siguientes comandos: 

Importar datos de países.

python manage.py cities --import=country

Importar datos de regiones (Estados)

python manage.py cities --import=region

Importar datos de sub regiones (Municipios).

python manage.py cities --import=subregion

Importar datos de ciudades.

python manage.py cities --import=city

Importar datos de códigos postales.

python manage.py cities --import=postal_code

En la terminal iremos viendo una barra de progreso por cada importación, algo como esto: 

 

Como ejemplo podemos ver que en el admin de Django encontraríamos 

 

 

Ejemplo de queries en django-cities. 

Ya teniendo información de estos registros es posible realizar diferentes consultas como por ejemplo: 

# Find the 5 most populated countries in the World
>>> Country.objects.order_by('-population')[:5]
[<Country: China>, <Country: India>, <Country: United States>,
 <Country: Indonesia>, <Country: Brazil>]

# Find what country the .ly TLD belongs to
>>> Country.objects.get(tld='ly')
<Country: Libya>

# 5 Nearest cities to London
>>> london = City.objects.filter(country__name='United Kingdom').get(name='London')
>>> nearest = City.objects.distance(london.location).exclude(id=london.id).order_by('distance')[:5]

# All cities in a state or county
>>> City.objects.filter(country__code="US", region__code="TX")
>>> City.objects.filter(country__name="United States", subregion__name="Orange County")

# Get all countries in Japanese preferring official names if available,
# fallback on ASCII names:
>>> [country.alt_names_ja.get_preferred(default=country.name) for country in Country.objects.all()]

# Alternate names for the US in English, Spanish and German
>>> [x.name for x in Country.objects.get(code='US').alt_names.filter(language_code='de')]
[u'USA', u'Vereinigte Staaten']
>>> [x.name for x in Country.objects.get(code='US').alt_names.filter(language_code='es')]
[u'Estados Unidos']
>>> [x.name for x in Country.objects.get(code='US').alt_names.filter(language_code='en')]
[u'United States of America', u'America', u'United States']

 

¡La librería busca maintainer!

Hace 3 meses el autor de esta librería publicó en el archivo README.md la siguiente nota: 

 

"CURRENTLY UNMAINTAINED - contact coderholic to take over maintainership of this project"

 

Tal vez para muchos esto sea una mala noticia, sin embago lo que el autor propone es dar la oportunidad a alguien más de poder mantener actualizada la herramienta para nuevas versiones de Python y el framework Django y una que otra funcionalidad adicional que vaya surgiendo en mente. Hoy por hoy la herramienta la encuentro muy completa.

¿Te animas a ser el nuevo maintainer? Contacta al autor: https://github.com/coderholic

------------

Bueno espero que esta publicación te haya servido y si quieres aprender más sobre esta herramienta, te invito a leer la documentación completa.

En lo personal a mi me ha servido de mucho y me ha librado de generar la funcionalidad desde cero y mejorar mis tiempos de desarrollo para este tipo de funcionalidades geográficas. 

¡Nos vemos! No olvides comentar y dejarnos tu opinión. 



Alex Dzul

FullStack Python / Django Developer. #jslove

Etiquetas

Temas relacionados