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