我在 Django 1.8.x 中使用django-cities-light(轻量版的django-cities)。它定义了 Country、Region/State 和 City 的抽象模型,以便我们可以扩展和添加自定义字段。例如,我们可以通过编写 post_import 信号处理程序来将时区添加到城市,如下所述。
同样,我需要将该字段添加capital
到每个国家/地区。我对 GeoDjango 不太熟悉,我知道django-cities
应用程序的 Country 有资本领域。
我在 Django 1.8.x 中使用django-cities-light(轻量版的django-cities)。它定义了 Country、Region/State 和 City 的抽象模型,以便我们可以扩展和添加自定义字段。例如,我们可以通过编写 post_import 信号处理程序来将时区添加到城市,如下所述。
同样,我需要将该字段添加capital
到每个国家/地区。我对 GeoDjango 不太熟悉,我知道django-cities
应用程序的 Country 有资本领域。
您需要设置自定义 Country 模型。假设您有一个带有 models.py 的应用程序“mygeonames”:
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'
但您可能希望改为与 Cities 表链接。
这是关于@irqed 答案的扩展想法:
class City(AbstractCity):
is_capital = models.BooleanField()
class Country(AbstractCountry):
def capital(self):
return self.city_set.filter(is_capital=True)
*请注意,我不熟悉该软件包(我只是假设它们用作city_set
相关名称)
为什么?好吧,对我来说,资本似乎更适合作为城市的属性。在尝试使用对象时,它还可以为您节省一些时间City
(例如,您想检查一个城市是否是首都 - 您不需要在不同的表上进行另一个查询并比较名称,您只需检查一个已经获取的布尔字段)