Как добавить капитал в модель страны django-city-light?

Я использую django- towns -light (облегченную версию django- towns) с Django 1.8.x. Он определяет абстрактные модели Country, Region/State и City, чтобы мы могли расширять и добавлять пользовательские поля. Например, мы можем добавить часовой пояс в город, написав обработчик сигнала post_import, как описано здесь.

Точно так же мне нужно добавить поле capital в каждую страну. Я не очень знаком в GeoDjango, и я знал, что django-cities Страна приложения имеет поле заглавных букв.

2 ответа

Решение

Вам необходимо настроить собственную модель страны. Допустим, у вас есть приложение "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'и поместите оба приложения 'towns_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'

Но вы можете вместо этого связать с таблицей городов.

Вот расширенная идея ответа @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 объекты (скажем, вы хотите проверить, является ли город столицей - вам не нужно делать другой запрос к другой таблице и сравнивать имена, вы просто проверяете уже извлеченное логическое поле)

Другие вопросы по тегам