Приложение для работы с базой данных ФИАС в Django
- загругка фиаса по новому формату ФИАС (AdrOB)
- фильтр по региону 36
- Импорт базы ФИАС из:
- архива XML или DBF
- каталога с XML или DBF
- напрямую с сайта http://fias.nalog.ru в формате XML или DBF
- Возможность хранить данные в отдельной БД
- Поле модели AddressField, предоставляющее в админке Django ajax-поиск адреса
- Поддержка полнотекстового поиска для поля AddressField (демо) с помощью:
- Sphinx Search Engine Для Debian, Ubuntu, RHEL, Windows есть пакеты
- Связанное поле модели для выбора района внутри выбранного в AddressField города (районы никак не привязаны к улицам, соответственно, их нужно выбирать отдельно, если это требуется)
- Несколько абстрактных моделей, немного упрощающих жизнь
- Django 1.7+ (Для работы с django 1.7 необходимо доустановить django_extensions)
- django_select2 5.3.0+
- `django_select2<https://github.com/applegrew/django-select2>`_ модуль интеграции Select2 с Django.
- dbfread Маленькая библиотека для работы с DBF. Для python3.3+ пока что нужно использовать мой `форк<https://github.com/Yuego/dbfread>`_
Обновите django-fias до версии 0.6.2, а django до версии 1.7 или выше. Смигрируйте базу данных:
python manage.py migrate fias 0001 --fake python manage.py migrate fias
Обновите django-fias до версии 1.0.0 Обновите все зависимости до актуальных версий (в частности django-select2 до версии не ниже 5.3.0). Обновите статические файлы:
python manage.py collectstatic
Обновите настройки django-fias (см. fias/config.py).
Установите django-fias:
pip install django-fias
Добавьте fias и django_select2 в ваш список INSTALLED_APPS.
Добавьте url(r'^fias/', include('fias.urls', namespace='fias')), в ваш urlpatterns
Любым доступным способом подключите к админке приложения, в котором будете использовать поле FiasAddress свежую версию jQuery:
# например так: class ItemAdmin(admin.ModelAdmin): class Media: js = ['//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.js'] admin.site.register(Item, ItemAdmin)
Если вы желаете использовать отдельную БД под данные ФИАС, выполните следующее
Создайте БД и подключите её к Джанго обычным способом
Добавьте в ваш settings.py параметр:
FIAS_DATABASE_ALIAS = 'fias'
где fias - имя БД
Добавьте в список DATABASE_ROUTERS:
fias.routers.FIASRouter
Выполните:
python manage.py migrate --database=fias
где fias - имя БД ФИАС
Выполните:
python manage.py migrate
Выполните:
python manage.py collectstatic
NOTE: поддерживаются только 2 СУБД: PostgreSQL и MySQL. NOTE2: для индексации базы в MySQL может потребоваться до 2-2.5ГБ свободного места во временном каталоге MySQL. NOTE3: нет необходимости слишком часто пересоздавать поисковый индекс базы ФИАС. Это требуется делать только после обновления базы.
- Установите:
- Sphinx Search Engine Для Debian, Ubuntu, RHEL, Windows есть пакеты
- Сгенерируйте конфигурацию sphinx:
Если у вы уже используете sphinx в проекте, то вам нужен только конфиг индекса. Выполните:
python manage.py fias_suggest --path=PATH > sphinx.conf
где PATH - путь до каталога с индексами sphinx.
Иначе выполните:
python manage.py fias_suggest --path=PATH --full > sphinx.conf
чтобы получить полный конфиг sphinx.
Замените конфиг sphinx полученными настройками (для Gentoo это файл /etc/sphinx/sphinx.conf, для Ubuntu: /etc/sphinxsearch/sphinx.conf)
Псоле того, как данные импортированы и обновлены выполните:
indexer -c /etc/sphinx/sphinx.conf --all
NOTE: для повторной переиндексации при запущенном Sphinx следует выполнять:
indexer -c /etc/sphinx/sphinx.conf --all --rotate
Запустите sphinx:
# для Gentoo /etc/init.d/searchd start # для Ubuntu /etc/init.d/sphinxsearch start
NOTE Если Sphinx работает на другом хосте или на другом порту, добавьте в settings.py словарь соответствующими параметрами:
FIAS_SEARCHD_CONNECTION = { 'host': '127.0.0.1', 'port': 9306, }
Из-за особенностей организации БД ФИАС, сортировка результатов поиска происходит не так, как хотелось бы. Поэтому, начиная с версии 0.4 добавлена возможность настроить веса типов адресных объектов по своему усмотрению. Для этого в settings.py добавьте словарь FIAS_SB_WEIGHTS вида:
FIAS_SB_WEIGHTS = { # СОКРАЩЕНИЕ: ВЕС 'г': 128, 'с': 100, }
- где
- СОКРАЩЕНИЕ - сокращённое наименование вида объекта из таблицы SocrBase
- ВЕС - число от 0 до 128
NOTE: по-умолчанию вес всех типов равен 64 NOTE: пример заполнения можно посмотреть в weights.py - там перечислены предустановленные веса.
Чтобы применить свои изменения, выполните:
python manage.py fias --fill-weights
Кроме того изменить веса можно в панели администрирования Django. Но помните, что эти изменения будут перезаписаны при следующем вызове упомянутой команды! После внесения изменений обязательно нужно переиндексировать базу.
Таблицы SOCRBASE и ADDROBJ импортируются всегда. Таблицы NORMDOC, LANDMARK, HOUSEINT и HOUSE по-умолчанию не импортируются.
Добавьте в ваш settings.py список названий таблиц, которые вы хотели бы импортировать:
FIAS_TABLES = ('normdoc', 'landmark', 'houseint', 'house')
Существует несколько способов импортировать данные в БД ФИАС
Полностью автоматический импорт с сайта ФИАС:
python manage.py fias --src auto [--format <xml|dbf>]
Здесь ключ --format указывает, в каком формате предпочтительно скачивать данные. Доступны значения xml или dbf. Такой способ не всегда целесообразен по разным причинам, поэтому лучше самостоятельно скачать полный архив и импортировать уже его:
# Архив с XML-файлами python manage.py fias --src /path/to/fias_xml.rar # Архив с DBF-файлами python manage.py fias --src /path/to/fias_dbf.rar # Каталог с распакованным содержимым архива python manage.py fias --src /path/to/fias_data/
Но! В случае, если в БД уже есть какие-то данные, скрипт выдаст соответствующее сообщение и прекратит работу. Такое поведение связано с тем, что при импорте из файла, если версия файла не совпадает с версией данных в какой-то таблице в БД ФИАС, данные в этой таблице могут быть удалены полностью и заменены новыми, при этом ORM Django при наличии связанных таблиц удалит данные так же и оттуда. Если вы уверены в том, что делаете, добавьте к предыдущей команде флаг --i-know-what-i-do:
python manage.py fias --src /path/to/fias_xml.rar --i-know-what-i-do # or python manage.py fias --src auto --i-know-what-i-do
Если по какой-то причине нужно импортировать всю БД ФИАС заново, добавьте флаг --truncate:
python manage.py fias --src /path/to/fias_xml.rar --truncate --i-know-what-i-do # or python manage.py fias --src auto --i-know-what-i-do
Если скачанный файл не актуален, можно добавить к указанной выше команде флаг --update - скрипт сразу после импорта обновит БД до актуальной версии.:
python manage.py fias --src /path/to/fias_xml.rar --update
NOTE Импортируются только актуальные записи. Если данные об объекте менялись, будет загружена самая последняя версия записи об этом объекте. Записи из будущего не импортируются.
Для обновления БД выполните:
python manage.py fias --update
Обновление выполняется только с сайта ФИАС. Обновить базу из файла нельзя.
NOTE Как это ни печально, но мы живём в России. Тут всякое бывает. Вот и сервис ФИАС время от времени подсовывает битые дельта-архивы. Чтобы оные пропускать автоматически и обновляться следующими по порядку, используйте флаг --skip совместно с --update
Для вывода всех возможных параметров импорта выполните:
python manage.py fias --help
Чтобы узнать, насколько актуальна локальная копия БД ФИАС, выполните:
python manage.py fiasinfo --db-version
Вы можете самостоятельно ссылаться на таблицы БД фиас.
Вы так же можете добавить в свои модели поле fias.fields.address.AddressField, которое предоставит вам удобный поиск адреса по базе и прявязку Один-ко-Многим вашей модели к таблице AddrObj базы ФИАС. (см. модель Item в тестовом приложении)
Либо вы можете унаследоваться от любой модели из fias.models.address, которые добавят несколько дополнительных полей к вашим моделям и выполнят за вас кое-какую рутину:
FIASAddress (см. модель CachedAddress в тестовом приложении)
Помимо поля address добавляет еще два: full_address и short_address. В первом хранится полная запись адреса (но без индекса), во втором - укороченная.
FIASAddressWithArea (см. модель CachedAddressWithArea в тестовом приложении)
Наследуется от предыдущей модели и добавляет еще поле area - позволяет указывать район города, выбранного в поле address (если, конечно, таковые имеются в БД ФИАС для данного города)
FIASHouse (см. модель CachedAddressWithHouse в тестовом приложении)
Миксин, добавляющий 3 поля house, corps и apartment - соответственно номер дома, корпус и квартира.
FIASFullAddress
Комбинация моделей FIASAddress и FIASHouse.
FIASFullAddressWithArea
Комбинация моделей FIASAddressWithArea и FIASHouse
NOTE: в моделях FIASFullAddress и FIASFullAddressWithArea реализованы методы _get_full_address и _get_short_address, возвращающие соответственно полную и сокращённую строку адреса, включая номер дома/корпуса/квартиры.
- Проверять списки удалённых объектов и все связанные с AddrObj модели мигрировать на правильные записи
- Если используется отдельная БД под данные ФИАС, в админке в список list_display нельзя добавлять поля типа ForeignKey
- South не умеет работать с несколькими БД
Коммит от EagerBeager Благодаря этому коммиту до меня наконец дошло, почему импорт отжирал память.