Django的场所模型和全球场所数据

django-cities的Python项目详细描述


#Django城市[PYPI版本](https://badge.fury.io/py/django cities.svg)(https://badge.fury.io/py/django-cities)[![构建状态](https://travis-ci.org/coderholic/django-cities.svg?branch=master)(https://travis-ci.org/coderholic/django-cities.svg?branch=master城市)和数据(来自[geonames](http://www.geonames.org/))可用于您的django项目。


此包正式支持所有当前受支持的python/django版本:

|---|---|---|---|---|
django 1.7:x::x::x::x::x::x::x:;
django 1.8:白色:白色:白色:白色;:白色:白色;:白色;:白色;:白色:白色;:大蓝色:大;
django 1.9:白色:白色:白色:白色;:白色;:白色;:x::白色勾选标记::白色勾选标记:|:大吉安戈1.10:白色;:x::白色:白色;:白色;:白色;:白色;:白色;:大吉安戈1.11;:白色;:大吉安戈1.11;:白色;:x:;:白色;:白色;:白色;:白色;:白色;:白色;:白色;:白色;:白色;:白色;:白色;:白色;:白色;:白色;:白色;:白色;:白色:
django 2.0:x:|:x::白色复选标记::白色复选标记::白色复选标记:
django[主](https://github.com/django/django/archive/master.tar.gz):x::x::x:

|:白色勾号:正式支持、测试并通过
:大的蓝色圆圈:测试并通过,但不正式支持
:白色方形按钮:不官方支持,可随时中断,大多数测试通过由[本·道林](http://www.coderholic.com)撰写的
:x:已知不相容性

以及一些伟大的[贡献者](https://github.com/coderholic/django cities/contributors)。

*[配置](配置)
*[迁移配置](迁移配置)
*[可交换模型](可交换模型)
*[可选名称类型](可选名称类型)
*[大陆数据](大陆数据)
*[运行迁移](运行迁移)
*[导入配置](导入配置)
*[下载目录](下载目录)
*[下载文件](下载文件)
*[货币数据](货币数据)
*[不再存在的国家](不再存在的国家)
*[邮政编码验证](邮政编码验证)
*[自定义'slugify()`函数](自定义slugify函数)
*[无地区城市](无地区城市)
*[要导入的语言/地区](要导入的语言/地区)
*[限制导入的邮政编码编码](限制输入邮政编码)
*[插件](插件)
*[导入数据](导入数据)
*[编写插件](编写插件)
*[示例]
*[示例]
*[第三方应用程序/扩展](;第三方应用程序-扩展)
*[待办事项]
*[待办事项]
*[第三方应用程序/扩展](第三方应用程序/扩展](第三方应用程序-扩展)
*[待办事项]
*[备注]
*[运行中的运行中的数据]
*[运行中的插件]
*[导入数据]
*[插件是的测试](运行测试)
*[发布说明](发布说明)

----

\有关详细信息和安装说明,请参阅[Geodjango文档](https://docs.djangoproject.com/en/dev/ref/contrib/gis/)。





ngo cities.git
```

##配置

您需要启用geodjango。请参阅[文档](https://docs.djangoproject.com/en/1.10/ref/contrib/gis/tutorial/setting-up)以获取指导。


您需要在项目设置中的"installed"应用程序中添加"cities"。py文件:

``python
installed_apps=(

"cities",


````

重写默认模型方法,或添加自定义管理器。此项目支持使用[django可交换模型项目](https://github.com/wq/django可交换模型)交换模型。

若要交换模型,请首先在自定义城市应用程序中定义自己的自定义模型。您需要从'cities.model s':

more_data=models.textfield()

通过
``````

>设置相应的选项来配置项目:


|:————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————上述定义,我们将把带点的**model**字符串添加到项目的"settings.py"中:

``python
只要`<;app_label>;<;model_class_name>;`。


一旦在"settings.py"中设置了该选项,django城市中所有合适的外键都将指向您的自定义模型。所以在上面的例子中,外键region.country、'city.country'和'postalcode.country'都会自动指向'customcountrymodel'。这意味着您不需要自定义任何依赖模型,如果您不想这样做的话。


比如到外部网站的链接(大多是维基百科文章)和发音指南(拼音)。然而,django cities只使用和导入这些类型的一个子集。由于有些用户可能希望全部使用它们,因此可以使用"cities_alternative_name_types"和"cities_airport_types"设置来定义数据库中的替代名称类型。

这些设置应指定为元组选项的元组:

``python
cities_airport_types=(
('iata',"(iata(机场)代码"),
('icao',"(icao(机场)代码"),
('faac',"(faac(机场)代码"),





```

否则,将不导入机场类型。


geonames数据还包含纯数字的可选名称。

_include_numeric_alternative_names`设置控制是否导入纯数字替代名称。设置为"true"导入它们,设置为"false"跳过它们。


然而,有不同的大陆模型,有不同数量的大陆。因此,有些用户可能希望通过将"cities_contain_data"设置为python字典来覆盖默认设置,其中键是大陆代码,值是(name,geonameid)元组。

请参阅维基百科关于大陆的文章:

https://en.wikipedia.org/wiki/contain number

[`cities/conf.py`](https://github.com/coderholic/django cities/blob/master/cities/conf.py l178):

``python
cities contain数据={
'af':('africa',6255146)、
'as':('asia',6255147)、
'eu':('europe',6255148)、
'na':('north america',6255149)、
'oc':('oceania',6255151)、
'sa':('south america',6255150)、
'an':('antarctica',6255152)、
}
`````

请注意,如果不使用这些默认设置,则需要使用'country'-pre'方法注册一个插件,以便在之前调整国家模型的大陆ID导入脚本处理国家并将其保存到数据库中。请将您的插件贡献回此项目的上游,以便其他人可以从您的工作中受益,方法是创建一个包含您的插件及其任何相关文档的拉取请求。

运行

``bash
python manage.py migrate cities
```


,创建所需的数据库表并将大陆数据添加到表中。





导入数据后更改这些设置可能没有预期的效果。


如果django cities安装在只读媒体上。

数据:

`` python
城市文件{
处理。请注意,这些文件是按指定的顺序处理的,因此列表中后面指定的文件中的重复数据将覆盖列表中前面指定的文件中的数据。

``python
cities\u files={
\…
'city':{
'filenames':["us.zip","gb.zip",],
"url":["http://download.geonames.org/export/dump/'+'{filename}]
},

}
`````

请注意,不需要在"城市文件"字典中指定所有键。未指定的任何键都将使用其在[`cities/conf.py`]中定义的默认值(https://github.com/coderholic/django cities/blob/master/cities/conf.py l26)。


但它仅限于货币代码(例如:"美元")和货币名称(例如:"美元")。Django Cities软件包提供了使用国家型号导入货币符号(例如:"$")的功能。

e大陆数据,由于这种情况很少改变,货币符号直接从python数据结构加载,该数据结构包含在"cities_currency_symbols"设置中的django cities分布中。如果用户希望添加或修改导入的货币符号,则可以覆盖此设置。

有关默认值,请参阅包含的[`cities/conf.py`文件](https://github.com/coderholic/django cities/blob/master/cities/conf.py l189)。

``python
"AED":"AED":"AED":"AED":"AED":"AED":"AFN":"AFN":"ALL","AMD":"AMD":"AMD":"AMG":"ANG":"ANG":"AOA":"KZ",
"ARS":"$","AUD":"$","AWG":"AWG":"AWG":"AWG":"AZN":"M",
"BAM":"BAM":"Km","BBD":"BBD":"$","BDT":"BDT":"BDT":"BDN":"BGN":"BBN":"BBN":"BHD":"BHD":"BHD":"BHD":"BHD":"BHD":"BHD":"BIF":"BIF":"":"fr",
"…
"uah":"","ugx":"sh","usd":"$","uyu":"$","uzs":"πb",
```


已不存在的国家

地理名称数据包括不再存在的国家。此时,这些国家是荷属安的列斯群岛(an)和塞尔维亚和黑山(cs)。如果要导入这些国家,请将"不再存在的城市"国家代码设置为空列表(`[]`)。

"an"]
```


其中一些邮政编码与他们国家的正规表达不符。希望在导入数据时忽略无效邮政编码的用户可以将"城市验证"邮政编码设置设置为"真",以跳过导入不验证国家邮政编码正则表达式的邮政编码。

验证,请更新邮政编码本身或geonames网站上的国家邮政编码正则表达式。这样做将有助于所有geonames用户(包括本项目,但也包括所有其他geonames用户)。

`` python
cities\u validate_posal_codes=true
````


custom`slugify()`函数

您可能希望自定义django cities生成的slugs。这样做,您需要编写自己的"slugify()"函数,并在"cities-slugify"函数中指定其点式导入路径:

``python
cities-slugify` cities.util.default-slugify'
```

以及物体本身产生的弹头。它应该以字符串的形式返回最终的slugify函数。

因为slugify函数包含可被多个对象重用的代码,因此django cities中的所有对象都只有一个slugify函数。为不同类型的物体产生不同的弹头,测试对象的类名(`obj.\uu class\uu.\uu name\uu`).


默认的slugify函数(请参阅[`cities/util.py`](https://github.com/coderholic/django cities/tree/master/cities/util.py l35)):

``python
slugify regexes

重新编译(r"["),再.unicode)
slugify-rgx=re.compile(r'[^-\w.-\w.u ~]',re.unicode)
multi-dashu-rgx=re.compile(r'-{2,},},re.unicode)
dashu und_rgx=re.compile(r'[-\u]\ux=re.unicode)
und \u-dashu-rgx=re.compile(r'[--\ux''''[-\u-rgx=re.unicode)
r/>r/>r/>r//r ^[[[[-------\ux-.\u]*',re.unicode)
结束字符rgx=re.compile(r'[-.\u]*$',re.unicode)



def default_slugify(obj,value):
如果value为none:
返回none

value=force_text(unicode_func(value))
value=unicodedata.normalize('nfkc',value.strip())
value=re.sub(to_und_rgx,''ux',value)
value=re.sub(slugify_rgx,'-',value)
value=re.sub(multi_dash_rgx,'-',value)
value=re.sub(dash_rgx,''ux',value)
value=re.sub(und_dash_rgx,''ux,值)
value=re.sub(起始字符,值)
value=re.sub(结束字符,值))
返回标记安全(值)
```

默认情况下,这些城市是按正常方式导入的(它们仍然有国家的外键),但如果您希望*避免*导入这些城市,将"cities_skip_cities_with_empty_regions"设置为"true":

``python
`import cities without region(默认为false)
cities_skip_cities_with_empty_regions=true
```

languages/locales

请注意,geonames数据中的许多可选名称没有指定语言代码,因此如果手动指定语言代码,并且不包含"und",不能导入任意多的可选名称。

特殊值:

*`all`-导入所有可选名称
*`und`-不指定语言代码的可选名称。导入时,将为这些替代名称分配一个"und"语言代码。如果未指定此语言代码,则不会导入未指定语言代码的替代名称。
*`language s`-导入Django项目的'settings.py`


代码,请参阅geonames上的[iso languagecodes.txt](http://download.geonames.org/export/dump/iso-languagecodes.txt)文件。"语言"]
```

"ca"]
```


有关详细信息,请参阅[编写插件](编写插件)部分。

要激活插件,您需要将它们的点式导入字符串添加到"cities_plugins"选项中。此示例激活django cities附带的"邮政编码ca"和"重置查询"插件:

``python
cities插件=[

导入大型数据集(例如"allcountries.zip")时减少内存使用量
"cities.plugin.reset_querys.plugin",
]
```

请注意,有些插件可能使用自己的配置选项:

``python
已配置所有导入设置,运行

``bash
python manage.py cities--import=all
````


>导入所有位置数据。

manage.py cities--import=city
```

**注意:**这可能需要很长时间,尽管在终端中绘制了进度条。

导入邮政编码可能比导入其他对象花费一到两个数量级的时间。





\writing plugins

例如,您可以使用它来调整一个国家所属的大陆,或者如果您自定义并覆盖任何django cities模型,则可以使用它来添加或修改任何其他数据。

plugin只是一个python类,它以成员身份实现了一个或多个hook函数。hook可以在导入脚本处理数据之前修改数据,也可以在导入脚本将对象保存到数据库之后修改数据库。由R通过调用"cities.conf.hookexception",插件可以跳过一段数据。

`|`国家邮政
`地区`地区`地区`地区
`次区域`次区域`次区域`邮政
`城市`城市`邮政
`地区`地区`邮政`|
`postal code``postal_u code_u pre``postal_u code_u post`
`alternativename``alt_u name`alt_u name_u post`

`hooks和` post` hooks的参数签名不同。所有"pre"钩子都有以下参数签名:

`"python
类…插件(对象):
model\pre(self,parser,item)
```

,而所有的``post`钩子也有可供其使用的已保存模型实例:

``python
类…插件(对象):
模型``post(self,parser,<;model>;\u实例,item)
``


传递给钩子的参数:

*`self`-插件对象本身
*`parser`-cities.command`management command的实例
*`<;model>;`instance`-基于'item`
*`item`-python字典创建的模型实例正在处理的行

请注意,参数名称只是约定,只要你保持它们的顺序,你可以随意地将它们重命名为任何你想要的名字。

这里有一个完整的骨架插件类示例:

``python
class complete skeleton plugin(object):
"
Django Cities的骨架插件,它具有所有对象类型的挂钩,并且
不会修改数据库中的任何导入数据或现有对象。
"
"注意:只需要定义其中一个方法。如果方法未定义,导入命令将避免调用未定义的方法。


def country_pre(self,parser,imported_data_dict):
pass


def country_post(self,parser,country_instance,导入的数据字典:
pass

def region_pre(self,parser,imported_data_dict):
pass

def region_post(self,parser,region_instance,imported_data_dict):
pass

def subsystem_pre(self,parser,导入的数据目录:
pass


def subsystem_post(self,parser,subsystem_instance,imported_data_dict):
pass


def city_pre(self,parser,imported_data_dict):
pass

def city_post(self,parser,city_instance,导入的数据指令:
pass

def district_pre(self,parser,imported_data_dict):
pass

def district_post(self,parser,district_instance,imported_data_dict):
pass

def alt_u name_pre(self,parser,imported_data_dict):
传递

def alt_name_post(self,parser,alt_name_instance,imported_data_dict):


def postal_code_pre(self,parser,imported_data_dict):
pass

def postal_code_post(self,parser,postal_code_instance,导入的数据字典:
pass
```

美国。

='ks':
raise hookexception("忽略不在美国堪萨斯州的城市");raise a hookexception跳过导入项
否则:
在将数据写入数据库之前修改数据的值
import_dict['admin1code']='ks'

def city_post(self,parser,city,导入数据:
code='ks')
重新保存任何不在堪萨斯州的现有项目
city.save()
````

有关详细信息,请参见[plugins](plugins)部分。





请参阅[`example directory`](https://github.com/coderholic/django cities/tree/master/example)。下面是一些小片段,向您展示导入数据后可能执行的查询类型:


``python
国家:印度>;,<;国家:美国>;,
<;国家:印度尼西亚>;,<;国家:巴西>;]

=city.objects.filter(country_u name='united kingdom').get(name='london')
>;>gt;nearest=city.objects.distance(london.location).exclude(id=london.id).order戋by('distance')[:5]

region_u code="tx")
>;>city.objects.filter(country_u name="United States",subsection_u name="Orange County")

[country.alt_names_ja.get_preferred(默认值=country.name)for country in country.objects.all()]


u'vereinigate staaten']
>;[x.name代表x in country.objects.get(code='us').alt_names.filter(language_code='es')]
[u'estados unidos']
>;[x.name代表x in country.objects.get(code='us').alt_names.filter(language_code='en')]
[u'United States of America',u'America',u"美国"]

<;alternativename:_汕(zh)>;,
<;alternativename:__(hi)>;,<;<;alternativename:B\283357;_(hi)>;,
<;alternativename:vankuveris(lt)>;,
<;alternativename:凡科威(fy)>;,
<;alternativename:凡科威(fy)>;,
<;alternativename:凡科威(fy)>;,__(arz)>;,<;AlternativeName: Ванкувер (mn)>,
<AlternativeName: ဗန်ကူးဗားမ_ (my)>, <AlternativeName: व्हँकूव्हर (mr)>,
<AlternternativeName: வான்கூவர் (ta)>, <AlternativeName: فانكوفر (ar)>,
<备选名称:Vankuver(AZ)>;,<;备选名称:γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ-γ(Be)>;,
<;备选名称:徝_徟_徝徝徝(BN)>;,<;备选名称:攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀攀)>;,
<;al<;备选名称:b_______可选名称:___(pa)>;,
'…(剩余元素被截断).']


Postalcode:94040>;,<;Postalcode:94041>;,<;Postalcode:94043>;,
<;Postalcode:94024>;,<;Postalcode:94022>;]
`````




s/扩展

这些是在"django cities"之上构建的应用程序。有助于从本质上扩展"Django城市"的功能。

*[Django机场](https://github.com/bashu/django-airports)为您提供可用于Django项目的机场相关模型和数据(来自OpenFlights)。




困难在于:

*为我们附带的插件添加测试
*最小化抽象基础模型上的属性数,并相应地调整导入脚本
*从django contrib light](https://github.com/yourlabs/django-cities-light/blob/stable/3.x.x/cities-light/contrib)(django rest framework集成、链式选择和自动完成)
*集成[libposal](https://github.com/openventures/libposal)以从中提取国家/城市/地区/邮政编码地址字符串




只有匹配的行将被覆盖。

cities manage命令有选项,请参阅"-help"。通过"日志记录"设置控制详细程度。





安装postgres、postgis和libgdal dev
2。创建"django湫u cities"数据库:

输入密码
createuser-d-s-p一些湫u用户名
输入密码
createdb-t模板0-e utf-8-l en湫us.utf-8-o多个django cities
psql-c'创建扩建Postgis;'-d Django嫒u市

>3。运行测试:

postgres_user=some_username postgres_password='password from createuser step'tox

rev parse head`travis庠u repo庠u slug='github-username/django cities'postgres庠user=some庠username postgres庠password='password from createuser ste'tox


您可以对一个临时Docker实例运行测试:

``bash
Docker run--rm-p 127.0.0.1:5432:5432 mdillon/postgis
````


导入脚本
*`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市`城市//`城市//`城市//`城市//`城市//`城市//


```bash
python manage.py migrate cities 0001--fake
```


-立面图
-区域
-货币
-货币名称
-语言
-邻居
-资本
-电话

替代名称支持已全面检修。代码和用法现在应该简单得多。请参阅下面更新的示例。

code字段不再包含父代码。美国加利福尼亚州的代码现在是"CA"。在以前的版本中是"us.ca"。

这些更改意味着从以前的版本升级并不简单。不过,所有的place id都是相同的,所以如果您确实想升级,应该可以升级。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
迭代值时的java HashMap线程安全性   java Android:从sqlite数据库检索数据   java OpeNni:颜色坐标到深度坐标   替换Java将所有逗号替换为分号,引号内的逗号除外   java如何获取数据库中的图像,并将其设置为特定行的表的“tooltipText()   java如何使用“没有休息吗?   java Spring引导与Gradle版本的Gradle问题   java无法更新oracle中的clob字段   用Java创建一个简单的银行账户   java openfire服务器是否实现了地雷功能?   java Android获取支持的区域设置列表   用sqlite安卓实现java简单数学计算   JavaAEMServlet获取请求头值   在java中生成随机16位数字   有类似dotnetkicks的东西吗。com for Java   xml@xmlanyement不会解组为特定的Java类型,而是在JAXBElement处停止   尝试反序列化对象时发生java错误   java如何将JSON对象从POSTMAN发送到Restful Web服务   com的java性能。太阳网httpserver。HttpServer和HttpURLConnection?