I'm using django-cities-light (lighter version of django-cities) with Django 1.8.x. It defines the abstract models of Country, Region/State and City, so that we can extend and add custom fields. For example, we can add timezone to city by writing a post_import signal handler as explained here.
Likewise I need to add the field capital
to each country. I'm not much familiar in GeoDjango and I knew that django-cities
app's Country has the capital field.
You need to setup a custom Country model. Lets say you have an app 'mygeonames' with models.py:
import cities_light
from django.db import models
from cities_light.settings import ICountry
from cities_light.receivers import connect_default_signals
from cities_light.abstract_models import (AbstractCountry, AbstractRegion,
AbstractCity)
class Country(AbstractCountry):
capital = models.CharField(max_length=50)
connect_default_signals(Country)
class Region(AbstractRegion):
pass
connect_default_signals(Region)
class City(AbstractCity):
pass
connect_default_signals(City)
def process_country_import(sender, instance, items, **kwargs):
instance.capital = items[ICountry.capital]
cities_light.signals.country_items_post_import.connect(process_country_import)
Then in settings.py you should specify CITIES_LIGHT_APP_NAME = 'mygeonames'
, and put both apps 'cities_light' and 'mygeonames' to INSTALLED_APPS
After that you can migrate your DB and run ./manage.py cities_light
At the end you should get something like this:
In [1]: from mygeonames.models import Country
In [2]: cc = Country.objects.all()
In [3]: cc[0].capital
Out[3]: u'Paris'
But you might want to link with Cities table instead.
here's an extended idea on @irqed answer:
class City(AbstractCity):
is_capital = models.BooleanField()
class Country(AbstractCountry):
def capital(self):
return self.city_set.filter(is_capital=True)
*Note that I'm not familiar with that package (I'm just assuming they used city_set
as a related name)
Why? well, to me capital seems to make more sense as an attribute for a city. It might also save you some time when trying to work with City
objects (say you want to check if a city is a Capital - you don't need to do another query on a different table and compare the names, you just check an already fetched boolean field)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With