如何为 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 进行另一个查询并进行比较名称,您只需检查一个已经获取的布尔字段)