2015-06-16 14 views
6

Django 1.8.x ile django-cities-light (django-cities'in daha hafif bir sürümünü kullanıyorum) kullanıyorum. Ülke, Bölge/Eyalet ve Şehir'in soyut modellerini tanımlar, böylece özel alanları genişletebilir ve ekleyebiliriz. Örneğin, here açıklandığı gibi bir post_import sinyal işleyicisi yazarak şehre saat dilimi ekleyebiliriz.Django şehirleri-ışık ülke modeline nasıl sermaye eklenir?

Benzer şekilde, her ülkeye capital alanını eklemem gerekiyor. GeoDjango'ya pek aşina değilim ve django-cities uygulamasının Ülkenin sermaye alanına sahip olduğunu biliyordum.

cevap

5

Özel bir Ülke modeli kurmanız gerekir.

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) 

Sonra settings.py size CITIES_LIGHT_APP_NAME = 'mygeonames' belirtmelidir ve sonra INSTALLED_APPS

her iki uygulamalarınızın cities_light 've 'mygeonames' koyun: Eğer models.py ile bir uygulama 'mygeonames' kullandığınızı varsayalım Eğer DB geçirmek ve sonunda ./manage.py cities_light

çalışabileceği böyle bir şey almalısınız:

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

Ancak bunun yerine Şehirler tablosuyla bağlantı kurmak isteyebilirsiniz.

+0

Mükemmel! 'ICountry.capital' aradığım anahtardı. Ve evet, başkent ismiyle City nesnesini sorgulamam gerekiyor. – Babu

2

burada @irqed Yanıta uzun bir fikirdir:

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

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

* Ben

Neden (Sadece onların ilgili isim olarak city_set kullanılan varsayarak) bu paketin aşina değilim unutmayın ? iyi, bana sermaye bir şehir için bir özellik olarak daha mantıklı görünüyor. Aynı zamanda City nesnesiyle çalışmaya çalışırken sizi biraz zaman kazandırabilir (bir şehrin bir Başkent olup olmadığını kontrol etmek istediğinizi varsayalım). Başka bir tablo üzerinde başka bir sorgulama yapmanız ve isimleri karşılaştırmanız gerekmiyorsa boole alanı alındı)

+0

İhtiyacım için @irqed tarafından verilen cevap iyi. BTW, eğer 'is_capital'' 'True' ya da' False' 'i ayarlamak için cevabı güncellerseniz yararlı olacaktır. Şehir modelini şehir ışığı uygulaması tarafından sağlanan yönetim komutuyla doldururken bunların bir yolu var mı? – Babu

+0

Uygulamaya aşina değilim, ancak bilgileri önceden tanımlıyorsanız, bir boolean alanı için aynı şeyi yapabileceğinizden eminim – yuvi

İlgili konular