如何为django-cities-light country model增加资金?

时间:2015-06-16 10:30:28

标签: python django timezone countries django-countries

我在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应用程序的国家/地区有资本领域。

2 个答案:

答案 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个对象时,也可能会节省一些时间(比如你想检查一个城市是否是一个资本 - 你不需要在另一个表上做另一个查询并比较名称,你只需检查一个已经获取的布尔字段)