Package: m3-django-fias
Приложение для работы с базой данных ФИАС в DjangoОсновные возможностиИмпорт базы ФИАС из:архива XML или DBFкаталога с XML или DBFнапрямую с сайтаhttp://fias.nalog.ruв формате XML или DBFИмпорт всех существующих справочников и классификаторов ФИАС (с возможностью выборочного импорта)Возможность хранить данные в отдельной БДВсе справочники и классификаторы доступны для просмотра в админке DjangoПоле модели 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модуль интеграции Select2 с Django.dbfreadМаленькая библиотека для работы с DBF. Для python3.3+ пока что нужно использовать мойфоркНекоторые особенностиЧасть справочников импортируется независимо от настроек: вся статусная информация, типы нормативных документов, типы адресных объектов, таблица AddrObjВсе справочники и классификаторы связаны между собой посредством ForeignKey, что требует консистентного состояния БД ФИАС. В реальной жизни такого не бывает, поэтому:В случае отсутствия родительского поля для ForeignKey включается механизм регрессивного импорта:При возникновении любой ошибки пачка объектов делится на части и каждая часть импортируется отдельноПри повторном возникновении ошибки часть с ошибкой снова делится и импортируется.Так повторяется, пока в пачке не останется один объект, который просто отбрасывается. Таким образом достигается минимальная просадка производительности импорта при возникновении ошибок.Описание ключей командной строки (python manage.py fias)--src<path|filename|url|AUTO>Путь до архива с БД ФИАС, каталога, в который предварительно был распакован архив или URL-адрес, с которого требуется скачать импортируемый архив
Отсутствующее значение или значение AUTO означает автоматическое получение данных с сайтаhttp://fias.nalog.ru--truncateУказывает полностью удалять все данные из таблицы перед импортом в неё--i-know-what-i-doВ случае если в БД уже есть какие-то данные, приложение не даст ничего импортировать, пока не будет указан этот ключ.
На возможность обновления никак не влияет.--updateОбновляет БД ФИАС до актуальной версии (после или вместо импорта).
Если в БД ничего ещё не импортировалось, будет выдано сообщение об ошибке.--skipИспользуется только вместе с –update. Указывает пропускать повреждённые архивы с обновлениями.--format<xml|dbf>Указывает, в каком формате скачивать архивы с данными ФИАС. Допустимоые значения: xml или dbf.--limitУстанавливает размер пачки записей, единовременно загружаемой в БД. Чем больше размер, тем быстрее импорт (в теории), но дольше обработка ошибок, если таковые возникнут.
По-умолчанию: 10000.--tablesЗадаёт список таблиц для импорта через запятую.--update-version-info<yes|no>Указывает, обновлять ли список версий БД ФИАС.
По-умолчанию: yes--fill-weightsОбновляет веса типов адресных объектов из FIAS_SB_WEIGHTS. СмотриНастройка весовниже.--keep-indexesПри первоначальном импорте удаляются все индексы из таблиц (кроме первичного ключа) перед импортом и пересоздаются заново после.
Ключ отключает такое поведение. На процесс обновления никак не влияет.--tempdir<path>Путь к каталогу, где будут размещены временные файлы в процессе импорта.
Каталог должен существовать и быть доступен для записи.Обновление 1.1.x до 1.2.0После установки данного обновления лучше выполнить полный импорт БД, т. к. из-за ошибки в предыдущих версиях
часть данных (коды ИФНС, ОКАТО, ОКТМО) была импортирована некорректно.Выполните:python manage.py migrate fiasОбновление 1.0.0 до 1.1.0Вполне возможна ситуация, когда миграция прервётся из-за неконсистентности БД.
В этом случае придётся выполнить полный импорт, т. к. искать проблемные записи слишком трудозатратно.Перед обновлениемсделайте резервную копию БД ФИАС!!!Перед обновлением убедитесь в наличии доступа в Интернет, т. к. в процессе будет скачана последняя версия ахрива БД ФИАС (полный архив).Если БД пуста, ничего качаться не будет.Выполните:python manage.py migrate fiasОбновление 0.6.1 до 1.0.0Обновите 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 --allNOTE: для повторной переиндексации при запущенном Sphinx следует выполнять:indexer -c /etc/sphinx/sphinx.conf --all --rotateЗапустите sphinx:# для Gentoo
/etc/init.d/searchd start
# для Ubuntu
/etc/init.d/sphinxsearch startNOTEЕсли 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 до 128NOTE: по-умолчанию вес всех типов равен 64NOTE: пример заполнения можно посмотреть в weights.py - там перечислены предустановленные веса.Чтобы применить свои изменения, выполните:python manage.py fias --fill-weightsКроме того изменить веса можно в панели администрирования Django.
Но помните, что эти изменения будутперезаписаныпри следующем вызове упомянутой команды!
После внесения изменений обязательно нужно переиндексировать базу.Импорт данныхРасшифровка сокращенийT: Table (Таблица) - импортируемая в данный момент таблицаL: Loaded (Загружено) - количество уже загруженных в таблицу строкU: Updated (Обновлено) - количество обновлённых записейS: Skipped (Пропущено) - количество пропущенных записей, не удовлетворивших условиям фильтров и валидаторов, из них:E: Errors (Ошибки) - количество записей, пропущенных из-за ошибокR: Regression (Регрессия) - статус режима регрессивного импорта. Первое число - уровень рекурсии. Чем глубже рекурсия, тем на более мелкие части разбита пачка записей. Числа в скобках обозначают <номер части>:<количество записей в части>. Количество чисел и их позиция соответствуют глубине рекурсии.FN: Filename (Имя файла) - имя файла импортируемой таблицыПервоначальная загрузка данныхСуществует несколько способов импортировать данные в БД ФИАСПолностью автоматический импорт с сайта ФИАС: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 --updateNOTEИмпортируются только актуальные записи. Если данные об объекте менялись, будет загружена самая последняя версия записи об этом объекте.
Записи из будущего не импортируются.Обновление существующей БДДля обновления БД выполните: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иFIASHouseNOTE: в моделяхFIASFullAddressиFIASFullAddressWithAreaреализованы методы_get_full_addressи_get_short_address, возвращающие соответственно полную и сокращённую строку адреса, включая номер дома/корпуса/квартиры.Настройка settings.pyFIAS_UNRAR_TOOL - путь до библиотеки UnRAR (по умолчанию unrar - поиск в глобальных переменных)TODOПроверять списки удалённых объектов и все связанные с AddrObj модели мигрировать на правильные записиИзвестные проблемыЕсли используется отдельная БД под данные ФИАС, в админке в списокlist_displayнельзя добавлять поля типаForeignKeyБлагодарностиКоммит от EagerBeagerБлагодаря этому коммиту до меня наконец дошло, почему импорт отжирал память.