Создание проекта и окружения. Установка библиотек. Модель. Создание проекта и окружения. Установка библиотек. Модель. reverse django

Создание проекта и окружения. Установка библиотек. Модель.

Open in new window

Задача.

Создать репозитори git и привязать к ней новый проект.

По данному sql дампу создать базу данных, и проект django с коннектом к ней.

Провести обратный инжениринг и создать модели для таблиц, требующих экспорта.

Создать комманду экспорта.

Создаем репозиторий git.

mkdir django-export-exel cd django-export-exel git init

Создаем файл README.md и делаем первый комит.

touch README.md
echo "Export to EXEL" >> README.md

Добавляем все изменения в индекс git.

git add .

Делаем первый пуш на сервер.

git commit -m "first commit"
git push -u origin master

start page

Качаем дамп базы.

start page

Разворачиваем базу.

start page

Создаем ВО, стартуем проект.

virtualenv -p python3 venv
. ./venv/bin/activate
pip install django
django-admin startproject prj
cd prj
./manage.py startapp export

Добавляем приложение в настройки settings.py.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'main'
]

Установка системных библиотек для работы с MySQL.

sudo apt-get install python3-dev libmysqlclient-dev build-essential

Устанавливаем библиотеки работы с MysSQL.

pip install mysqlclient

Прописываем коннект к базе в settings.py.

DATABASES = { ‘default’: { ‘ENGINE’: ‘django.db.backends.mysql’, ‘NAME’: ‘DB_NAME’, ‘USER’: ‘DB_USER’, ‘PASSWORD’: ‘DB_PASSWORD’, ‘HOST’: ‘localhost’, # Or an IP Address that your DB is hosted on ‘PORT’: ‘3306’, } }

Проверяем все ли верно с коннектом делая миграцию.

./manage.py migrate

Проводим обратный инженеринг.

Создаем классы модели из физической базы данных. Выгружаем все в файл export-model.py

./manage.py inspectdb > export-model.py

Будем ипользовать этот файл исключительно для копипаста кода.

Находим первый класс таблицы для експорта и копируем его нам в приложение.

class ShopCommodity(models.Model):
    commodity_id = models.AutoField(db_column='commodity_ID', primary_key=True)  # Field name made lowercase.
    dom_id = models.IntegerField()
    cod = models.CharField(max_length=100)
    commodity_price = models.FloatField()
    cur_id = models.IntegerField()
    commodity_old_price = models.FloatField()
    commodity_ves = models.FloatField()
    commodity_status = models.CharField(max_length=100)
    commodity_bigphoto = models.CharField(max_length=100)
    commodity_visible = models.CharField(max_length=100)
    commodity_add_date = models.CharField(max_length=20)
    commodity_action = models.IntegerField()
    commodity_hit = models.IntegerField()
    commodity_new = models.IntegerField()
    commodity_order = models.IntegerField()
    vendor = models.IntegerField()
    from_url = models.CharField(max_length=300)
    recomandate = models.CharField(max_length=200)
    lng_id = models.IntegerField()
    alias = models.CharField(max_length=200)
    use_alias = models.IntegerField()
    com_name = models.CharField(max_length=200)
    com_desc = models.TextField()
    com_fulldesc = models.TextField()
    title = models.CharField(max_length=100)
    description = models.TextField()
    keywords = models.TextField()
    weight = models.FloatField()
    height = models.FloatField()
    width = models.FloatField()
    depth = models.FloatField()

    class Meta:
        managed = False
        db_table = 'shop_commodity'

Создадим для него админку в main/admin.py.

from .models import ShopCommodity

class ShopCommodityAdmin(admin.ModelAdmin):
    list_display = ['commodity_id', 'com_name']

admin.site.register(ShopCommodity, ShopCommodityAdmin)

Добавляем суперпользователья и запускаем веб сервер.

./manage.py createsuperuser
./manage.py runserver 9898

Заходим в админку.

http://localhost:9898/admin

start page

Делаем комманду для выгрузки данных

Нам необходимо создать следующую структуру каталогов и файлов в папке приложения.

main/
    management/
        __init__.py
        commands/
            __init__.py

Сделаем это с помощью bash команд

cd main
mkdir management
mkdir management/commands
touch management/__init__.py
touch management/commands/__init__.py

Создаем пустую команду main/management/commands/export_data.py.

from django.core.management.base import BaseCommand, CommandError

class Command(BaseCommand):

    def handle(self, *args, **options):
        print('Export data')

Проходим циклом по таблице (модели) ShopCommodity.

from main.models import ShopCommodity

class Command(BaseCommand):

    def handle(self, *args, **options):
        print('Export data')
        for item in ShopCommodity.objects.all():
            print(item.com_name)

Выгрузим имена товаров в эксель.

Добавим в окружение библиотеку для записи в exel.

Документация

pip install xlwt

Создание файла exel.

wb = xlwt.Workbook()
ws = wb.add_sheet('Items')

Запись в ячейку.

ws.write(x, y, 'Hello world!!!')

Сохранение файла.

wb.save('example.xls')

Выгружаем в нужном формате.

Ссылка на спецификацию экспорта

Первые 8 столбцов.

class Command(BaseCommand):

    def handle(self, *args, **options):
        print('Export data')

        wb = xlwt.Workbook()
        ws = wb.add_sheet('Export Products Sheet')
        # title


        ws.write(0, 0, 'Код_товара')
        ws.write(0, 1, 'Название_позиции')
        ws.write(0, 2, 'Описание')
        ws.write(0, 3, 'Тип_товара')
        ws.write(0, 4, 'Цена')
        ws.write(0, 5, 'Валюта')
        ws.write(0, 6, 'Единица_измерения')
        ws.write(0, 7, 'Ссылка_изображения')
        ws.write(0, 8, 'Наличие')
        ws.write(0, 9, 'Номер_группы')
        ws.write(0, 10, 'Название_группы')
        ws.write(0, 11, 'Уникальный_идентификатор')
        ws.write(0, 12, 'Производитель')
        ws.write(0, 13, 'Страна_производитель')
        ws.write(0, 14, 'Измерение_Характеристики')
        ws.write(0, 15, 'Название_Характеристики')
        ws.write(0, 16, 'Измерение_Характеристики')
        ws.write(0, 17, 'Значение_Характеристики')
        ws.write(0, 18, 'Название_Характеристики')
        ws.write(0, 19, 'Измерение_Характеристики')
        ws.write(0, 20, 'Значение_Характеристики')

        x = 1
        for item in ShopCommodity.objects.all():
            ws.write(x, 0, item.commodity_id)
            ws.write(x, 1, item.com_name)
            ws.write(x, 2, item.com_fulldesc[:32000])
            ws.write(x, 3, 'r')
            ws.write(x, 4, item.commodity_price)
            ws.write(x, 5, 'UAH')
            ws.write(x, 6, 'шт.')
            img_url = 'http://www.climainvest.com.ua/%sstitle/%s.jpg' % (item.commodity_id, item.alias)
            ws.write(x, 7, img_url)
            ws.write(x, 8, '!')

            print(item.com_name)
            x += 1

        wb.save('export.xls')

Далее нам необходимо загрузить список категорий.

Добавим лист.

  ws = wb.add_sheet('Export Products Sheet')
  cats = wb.add_sheet('Export Groups Sheet')

Создадим отдельную ф-цию заполнения листа категорий.

def export_catalog(sheet):
    sheet.write(0, 0, 'Номер_группы')
    sheet.write(0, 1, 'Название_группы')
    sheet.write(0, 2, 'Идентификатор_группы')
    sheet.write(0, 3, 'Номер_родителя')
    sheet.write(0, 4, 'Номер_родителя')
    return sheet

class Command(BaseCommand):

    def handle(self, *args, **options):
        print('Export data')

        wb = xlwt.Workbook()
        ws = wb.add_sheet('Export Products Sheet')
        cats = wb.add_sheet('Export Groups Sheet')
        cats = export_catalog(cats)

Перенесем класс модели.

class ShopCategories(models.Model):
    categories_of_commodities_id = models.AutoField(primary_key=True)
    categories_of_commodities_photo = models.CharField(max_length=100)
    categories_of_commodities_parrent = models.IntegerField()
    categories_of_commodities_order = models.IntegerField()
    categories_of_commodities_add_date = models.CharField(max_length=19)
    lng_id = models.IntegerField()
    cat_name = models.CharField(max_length=200)
    alias = models.CharField(max_length=200)
    use_alias = models.IntegerField()
    cat_desc = models.TextField()
    title = models.CharField(max_length=100)
    description = models.TextField()
    keywords = models.TextField()
    h1 = models.CharField(max_length=200)
    visible = models.IntegerField()

    class Meta:
        managed = False
        db_table = 'shop_categories'

Админка

class ShopCategoriesAdmin(admin.ModelAdmin):
    list_display = [
        'cat_name', 
        'categories_of_commodities_parrent'
        ]

admin.site.register(ShopCategories, ShopCategoriesAdmin)

start page

Копируем модель таблицы связи товаров и каталогов.

class ShopCommoditiesCategories(models.Model):
    categoryid = models.IntegerField(db_column='categoryID')  # Field name made lowercase.
    commodityid = models.IntegerField(db_column='commodityID')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'shop_commodities-categories'

Для работы в инфраструктуре Джанго необходимо вручную добавить поле id в таблицу

Дополним функцию.

def export_catalog(sheet):
    sheet.write(0, 0, 'Номер_группы')
    sheet.write(0, 1, 'Название_группы')
    sheet.write(0, 2, 'Идентификатор_группы')
    sheet.write(0, 3, 'Номер_родителя')
    sheet.write(0, 4, 'Идентификатор_родителя')
    x = 1
    for cat in ShopCategories.objects.all():
        sheet.write(x, 0, cat.categories_of_commodities_id)
        sheet.write(x, 1, cat.cat_name)
        sheet.write(x, 2, cat.categories_of_commodities_id)
        sheet.write(x, 3, cat.categories_of_commodities_parrent)
        x += 1
    return sheet

Вытащим категорию товаров и запишем в exel.

        ...
    ws.write(x, 8, '!')

    # category
    # select category for item
    try:
        i2c = ShopCommoditiesCategories.objects.get(commodityid=item.commodity_id)
        # select category
        cat = ShopCategories.objects.get(categories_of_commodities_id=i2c.categoryid)
        ws.write(x, 9, cat.categories_of_commodities_id)
        ws.write(x, 10, cat.cat_name)
    except:
        print('No category')

Other topics