我在Django 1.8.x中使用django-cities-light(较轻版本的django-cities)。它定义了Country,Region / State和City的抽象模型,以便我们可以扩展和添加自定义字段。例如,我们可以通过编写一个post_import信号处理程序为时区添加时区,如here所述。
同样,我需要将字段video_title=$(echo $video_title | tr -d '?![]')
添加到每个国家/地区。我对GeoDjango并不熟悉,我知道capital
应用程序的国家/地区有资本领域。
答案 0 :(得分:5)
您需要设置自定义国家/地区模型。 假设你有一个应用程序'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'
但您可能希望改为与Cities表链接。
答案 1 :(得分:2)
这是@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
个对象时,也可能会节省一些时间(比如你想检查一个城市是否是一个资本 - 你不需要在另一个表上做另一个查询并比较名称,你只需检查一个已经获取的布尔字段)