6

我在 Django 1.8.x 中使用django-cities-light(轻量版的django-cities)。它定义了 Country、Region/State 和 City 的抽象模型,以便我们可以扩展和添加自定义字段。例如,我们可以通过编写 post_import 信号处理程序来将时区添加到城市,如下所述

同样,我需要将该字段添加capital到每个国家/地区。我对 GeoDjango 不太熟悉,我知道django-cities应用程序的 Country 有资本领域。

4

2 回答 2

6

您需要设置自定义 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 表链接。

于 2015-06-19T16:23:54.060 回答
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(例如,您想检查一个城市是否是首都 - 您不需要在不同的表上进行另一个查询并比较名称,您只需检查一个已经获取的布尔字段)

于 2015-06-25T08:38:25.727 回答