如何为 django-cities-light country 模型添加资本?
How to add capital to django-cities-light country model?
我正在使用 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。
同样,我需要为每个国家/地区添加字段 capital
。我对 GeoDjango 不太熟悉,我知道 django-cities
应用程序的 Country 有大写字段。
您需要设置自定义国家/地区模型。
假设您有一个应用程序 'mygeonames' 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)
然后在 settings.py 中你应该指定 CITIES_LIGHT_APP_NAME = 'mygeonames'
,并将应用程序 'cities_light' 和 'mygeonames' 都放在 INSTALLED_APPS
之后你可以迁移你的数据库和 运行 ./manage.py cities_light
最后你应该得到这样的东西:
In [1]: from mygeonames.models import Country
In [2]: cc = Country.objects.all()
In [3]: cc[0].capital
Out[3]: u'Paris'
但您可能希望 link 改为使用城市 table。
这是关于@irqed 回答的扩展想法:
class City(AbstractCity):
is_capital = models.BooleanField()
class Country(AbstractCountry):
def capital(self):
return self.city_set.filter(is_capital=True)
*请注意,我不熟悉那个包(我只是假设他们使用 city_set
作为相关名称)
为什么?好吧,对我来说 capital 作为城市的属性似乎更有意义。在尝试使用 City
对象时,它还可以为您节省一些时间(假设您想检查一个城市是否是首都 - 您不需要对不同的 table 进行另一个查询并进行比较名称,您只需检查一个已经获取的布尔字段)
我正在使用 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。
同样,我需要为每个国家/地区添加字段 capital
。我对 GeoDjango 不太熟悉,我知道 django-cities
应用程序的 Country 有大写字段。
您需要设置自定义国家/地区模型。 假设您有一个应用程序 'mygeonames' 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)
然后在 settings.py 中你应该指定 CITIES_LIGHT_APP_NAME = 'mygeonames'
,并将应用程序 'cities_light' 和 'mygeonames' 都放在 INSTALLED_APPS
之后你可以迁移你的数据库和 运行 ./manage.py cities_light
最后你应该得到这样的东西:
In [1]: from mygeonames.models import Country
In [2]: cc = Country.objects.all()
In [3]: cc[0].capital
Out[3]: u'Paris'
但您可能希望 link 改为使用城市 table。
这是关于@irqed 回答的扩展想法:
class City(AbstractCity):
is_capital = models.BooleanField()
class Country(AbstractCountry):
def capital(self):
return self.city_set.filter(is_capital=True)
*请注意,我不熟悉那个包(我只是假设他们使用 city_set
作为相关名称)
为什么?好吧,对我来说 capital 作为城市的属性似乎更有意义。在尝试使用 City
对象时,它还可以为您节省一些时间(假设您想检查一个城市是否是首都 - 您不需要对不同的 table 进行另一个查询并进行比较名称,您只需检查一个已经获取的布尔字段)