2015-06-16 24 views
6

Sto usando django-cities-light (versione più leggera di django-cities) con Django 1.8.x. Definisce i modelli astratti di Paese, Regione/Stato e Città, in modo che possiamo estendere e aggiungere campi personalizzati. Ad esempio, possiamo aggiungere il fuso orario alla città scrivendo un gestore di segnale post_import come spiegato here.Come aggiungere capitale al modello country di django-city-light?

Allo stesso modo, è necessario aggiungere il campo capital a ciascun paese. Non ho molta familiarità con GeoDjango e sapevo che il Paese delle app django-cities ha il campo maiuscola.

risposta

5

È necessario impostare un modello Paese personalizzato. Diciamo che avere un app 'mygeonames' con 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) 

Poi nel settings.py è necessario specificare CITIES_LIGHT_APP_NAME = 'mygeonames', e mettere entrambe le applicazioni 'cities_light' e 'mygeonames' a INSTALLED_APPS

Dopo che è possibile migrare il DB ed eseguire ./manage.py cities_light

alla fine si dovrebbe ottenere qualcosa di simile:

In [1]: from mygeonames.models import Country 
In [2]: cc = Country.objects.all() 
In [3]: cc[0].capital 
Out[3]: u'Paris' 

Ma potresti voler collegare la tabella delle città.

+0

Perfetto! "ICountry.capital" era la chiave che stavo cercando. E sì, devo interrogare l'oggetto City con il nome in maiuscolo. – Babu

2

Ecco un'idea estesa sulla risposta @irqed:

class City(AbstractCity): 
    is_capital = models.BooleanField() 

class Country(AbstractCountry): 
    def capital(self): 
     return self.city_set.filter(is_capital=True) 

* Si noti che non sono a conoscenza che il pacchetto (sto solo supponendo hanno usato city_set come un nome correlato)

Perché ? bene, a me capitale sembra avere più senso come un attributo per una città. Potrebbe anche farti risparmiare tempo quando cerchi di lavorare con gli oggetti City (diciamo che vuoi controllare se una città è una capitale - non devi fare un'altra query su una tabella diversa e confrontare i nomi, basta controllare una già fetched boolean field)

+0

Alla mia richiesta la risposta di @irqed si adatta bene. A proposito, sarebbe utile se aggiorni la risposta per impostare 'is_capital' su' True' o 'False'. È il loro modo di farlo mentre popolano il modello di città attraverso il comando di gestione fornito dall'app city-light? – Babu

+0

Non ho familiarità con l'app, ma se riesci a prepopolare le informazioni, sono sicuro che puoi fare lo stesso per un campo booleano – yuvi

Problemi correlati