Рубрики
Без рубрики

Игра с моделями Django

Поделиться некоторое дело недавно узнала, работая над приложением Django. Помечено Django, Python, MySQL, Dev.

Эй, ребята, Недавно я построил WebApp для моего друга, помогая ему за некоторыми фрилансными вещами, где мне пришлось копаться в довольно много базы данных и моделирования моделирования ER, и было довольно круто, относящимся к старым классам СУБД со всем Django. Поэтому я думал, что это будет отличная возможность поделиться тем, что я узнал с сообществом. Конечно, это предполагает, что вы знакомы с Python и Django. Если нет, Это это отличное место для начала.

Прежде чем мы доберемся, давайте синхронизируемся на наших предметах обязанности. Я использовал Django 2.2 и Python 3.7 на протяжении всего этого поста. Я настоятельно рекомендую использовать виртуальную среду для настройки всех зависимостей. Теперь, пока Django поставляется с базой данных по умолчанию SQLite, мне нужно что-то более безопасное, и поэтому я использовал MySQL. Кроме того, я думал, что это будет хороший шанс научиться использовать Django с различными видами баз данных. Все в этом посте также можно сделать с помощью SQLite, кстати. В любом случае, я приду пост на создании Django с MySQL в ближайшее время.

Так что начать, скажем, мы строим веб-сайт электронной коммерции, и давайте доступны два приложения сейчас: продукты и заказы. В Django приложение является независимым модулем, и в этом приложении мы будем держать все, связанное с этим. Можно рассматривать как независимую службу, а не «приложение», поскольку мы обычно используем термин. Так что после настройки нашего проекта давайте создадим приложение, как это:

python manage.py startapp products
python manage.py startapp orders 

На данный момент мы сосредоточимся только на приложении продуктов. Откройте это приложение в нашем любимом редакторе кода (я люблю использовать подслушительный текст). Внутри наших продуктов приложение должно быть файл Python models.py . Прежде чем мы продолжим дальше, давайте спросим, что такое модель, а что это Models.py все о. Ответ на это не так сложно. Ядро любого приложения – это данные. Теперь, какая реляционная база данных позволяет нам делать, это организовать, управлять этими данными в безопасной, неисправной толерантной способности. К сожалению, что только данные не достаточно, чтобы построить приложение. Нам нужно выполнить какую-то логику, то, что приложение в конечном итоге делает, позволяет сказать в нашем случае со всеми предметами, которые мы можем разместить заказ и уведомить продавца, отправить почту клиентам, мы можем применить акции, скидки и тому подобное. Таким образом, нам нужен способ представлять данные в базе данных. Вот где приходит модель. Модель похожа на ОРМ Отказ В простейших терминах это означает, что объекты базы данных могут быть представлены в виде классов Python, а каждая строка в качестве объекта. И на этих объектах мы можем сделать всевозможные манипуляции. Мы увидим все это через минуту. И все это мы делаем в нашем Models.py файл.

Так что давайте прыгнуть в Models.py Отказ То, как мы делаем наши собственные модели или представление Python O о субъектах в RDBMS – это классы Python. Так что здесь я определил класс, который будет представлять объект продукта:

from django.db import models

# Create your models here.
class Products(models.Model):
    title = models.CharField(max_length=120)
    description = models.TextField()

Так что мы здесь сделали? Для приложения нашего продукта мы определили модель. Таким образом, все объекты продукта будут иметь заголовок и описание. Нам также нужно зарегистрировать нашу модель, так что видно в нашем приложении. Для этого нам нужно включить его в admin.py Отказ

from django.contrib import admin

# Register your models here.
from products.models import Products

Нам также нужно добавить это приложение в нашем главном settings.py В порции установленных_apps, чтобы сказать Django, что мы хотим использовать это приложение.

Итак, теперь, что нам нужно сделать, это принести нашу базу данных до синхронизации с помощью этого нового объекта, которую мы определили. Для этого нам нужно запустить миграцию базы данных. Мы можем просто пойти и бежать Python Manage.py Makemigrations , и мы должны увидеть что-то вроде этого:

Migrations for 'products':
  products/migrations/0001_initial.py
    - Create model Products

Тогда давайте применим эти миграции, делая Python Manage.py мигрировать . Мы получаем что-то подобное:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, products, sessions
Running migrations:
  Applying products.0001_initial... OK

Так что случилось здесь? Возможно, вы заметили, когда мы побежали макемиграции Новый файл был создан внутри приложения вашего продукта, в папке, называемой миграцией. Этот файл в основном сообщает нам различия между текущей конфигурацией в базе данных и то, что у нас есть в наших моделях. В нашем случае мы добавили новое предприятие в наших моделях, и она отсутствовала в базе данных. Затем мы применили эти изменения и синхронизированные базу данных с нашей моделью. Обратите внимание, что эти изменения были на самом деле не нанесены, пока мы не ударим мигрировать Отказ Давайте откроем этот файл, который был создан при выполнении Макемиграция Отказ

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Products',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=120)),
                ('description', models.TextField()),
            ],
        ),
    ]

Смотрите этот список операций там? Это говорит Django, какие миграционные операции будут сделаны. В этом случае необходимо создать модель в базе данных. Эта новая модель имеет поля, которые я дал в Models.py и что-то дополнительно под названием автофел. Это особый вид поле, который был добавлен автоматически Django и используется в качестве уникального идентификатора. Если мы хотим изменить его, мы просто делаем изменение файла миграции и повторно запускать миграции. Но мы оставим это еще на другой день:)

Хорошо, так что все, что разговор хорошо, но какая разница это сделала в наше приложение. Давайте узнаем: У меня есть мой appserver работает, поэтому давайте быстро проверим приложение администратора один раз. Мы можем получить доступ к нему в localhost: 8000/admin . Как только вы войдете, вот что он должен выглядеть: Давайте попробуем создать на объект из Admin App: Обратите внимание, как поля в форме основаны на типов поля, которые мы определены в модели. Мы можем играть вокруг с нагрузками других типов полей. Я хотел бы упомянуть здесь, что Django Документация Фантастический и практически о чем угодно, что вам нужно будет построить приложение для производства, можно найти в документах. Я буду ссылаться на документы очень часто и добавить еще несколько полей нашей модели. Между тем вот объект, который я создал из консоли. (Есть и другие способы сделать это тоже, больше на что позже) Поэтому после добавления еще нескольких полей моя модель выглядит так:

from django.db import models

# Create your models here.
class Products(models.Model):
    PRODUCT_CATEGORIES=[
        ('CLOTH', 'Clothing'),
        ('HOME', 'Home'),
        ('STAT', 'Stationery'),
    ]
    title = models.CharField(max_length=120, verbose_name='Product Title')
    description = models.TextField(blank=False, verbose_name='Product Description')
    price = models.DecimalField(max_digits=9, decimal_places=2, verbose_name='Price in INR')
    size = models.PositiveIntegerField(verbose_name='Size')
    product_category = models.CharField(max_length=40, verbose_name='Product Category', choices=PRODUCT_CATEGORIES)
    create_ts = models.DateTimeField(auto_now_add=False)

Давайте посмотрим на эти новые поля: Ну, первый – наш простой старый заголовок, кроме сейчас, мы добавили несколько аргументов или вариантов в поле. У нас уже было max_length нет очков за угадать то, что это делает. verbose_name это имя поля, которое мы хотели бы дать. Необязательно, если мы не укажем, что Django автоматически примет самому имени поля (см. Файл миграции). Посмотрите на два предыдущих скриншота: в первом я не использовал verbose_name. , второй я сделал. Кроме того, мы указывали, что поле названия будет Шарфилд с ограниченной мощностью, в отличие от Текстовое поле , который мы использовали для описания. В описании обратите внимание, мы использовали пустой = Ложь Отказ Это означает, что это поле потребуется. И наоборот, пустой = Правда означает, что мы позвольте этому полю быть пустым. Итак, следующая цена, а очевидный выбор был Десятичное поле Отказ Я разместил еще несколько вариантов, max_digits и decimal_places Отказ Первый указывает количество цифр в двойном десятике, а второе количество цифр после десятичного времени. В моем примере мы можем иметь 7 цифр до десятичной и 2 после того, как 9999999,99 – это максимальное значение, которое мы можем хранить в цене. (Что мы продаем, бриллианты?!). Я также использовал PostiTITITETEGERFIELD Для хранения размера элемента. Теперь допустим, для поля мы хотим, чтобы значения были ограничены из набора значений, и мы можем выбрать только от них. Конечно, мы можем сделать это в интернет-конце, или в самой форме, но мы также можем сделать это в модели. Для этого нам просто нужно пройти список разрешенных значений в поле в качестве опции Выбор Отказ Уведомление здесь для списка кортежей, которые я прошел, первый элемент в кортеже будет сохранен в базе данных, а второй будет отображаться в Admin App (или любая другая форма модели). Datetimefield используется для хранения временного времени даты. Здесь я использовал его в качестве временной техники, когда мой объект был впервые создан. auto_now_add автоматически отпечатан с текущим временем, когда объект сначала создается. Даже если отредактировано, это поле остается прежним. Это делает его отличным от своего двоюродного брата auto_now , который обновляется. Хорошо, теперь теперь позволяет синхронизировать нашу базу данных, запустив Макемиграция а потом мигрировать

You are trying to add a non-nullable field 'create_ts' to products without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 

Хорошо, так что теперь что это? Ну, вы видите, что мы хотим быть абсолютно уверены, что мы обеспечиваем все ограничения на все строки, а Django не позволит нам применить эти миграции, если даже один ряд имеет данные, которые их нарушают. У меня был один объект в моей базе данных из моей предыдущей миграции, просто имея два поля. Так что теперь Django дает мне возможность либо предоставить дефалотацию для Coloumn, либо исправить вещи в моей модели. Мы исправим модель как можно лучше. Поэтому я изменил следующие поля в Models.py :

create_ts = models.DateTimeField(default=timezone.now, editable=False)

redable_false Убедитесь, что это поле не появится в администраторе или любой другой форме и не может быть отредактирован. Но даже после этого мы получим ту же ошибку, для других полей сейчас. На этот раз я решил дать значение по умолчанию, как это:

Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>>

Я дал Правда Для всех, как у меня был только один элемент в моей базе данных, и файл миграции был создан.

Migrations for 'products':
  products/migrations/0003_auto_20190810_2048.py
    - Add field create_ts to products
    - Add field price to products
    - Add field product_category to products
    - Add field size to products

Я применил миграцию. Между тем, если мы посмотрим на файл миграции, мы видим некоторые Addfield и Alterfields на новых полях и Название соответственно. Теперь наша форма должна выглядеть так (обратите внимание на create_ts отсутствует): Позволяет сделать быстрое заглянуть в нашу базу данных (обратите внимание, как первый элемент имеет значения по умолчанию): Так что это довольно круто, верно? Но есть много больше, мы можем сделать, и документы чрезвычайно полезны, поэтому не останавливайся здесь. Теперь ORMS также включает в себя некоторые API для запроса базы данных, чтобы вам не нужно запускать фактические запросы для получения или обновления данных. Какой смысл представления данных базы данных как объекты Python, если вы не можете их использовать? Это где Queryset API входят. Queryset s Позвольте нам запустить все операции в нашей базе данных, хотя экземпляр нашего класса модели. Позвольте мне показать вам, что я имею в виду. Давайте запустим: Python Manage.py Shell. И мы представлены обычной скорлупой Python. Особые вещи в этом заключается в нашей виртуальной среде, и все наши приложения Django доступны здесь. Давайте попробуем это:

Python 3.7.1 (default, Dec 14 2018, 19:28:38) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from products.models import Products
>>> print(Products.objects.all())
, , , ]>
>>> 

WHOA! Что мы делали здесь? Ну, мы просто импортировали наши продукты приложение (папка продукта имела __init__.py Так что это модуль) И мы импортировали нашу модель класса Продукт . Products.Objects.all () это Queryset API, который мы позвонили, и он вернул список всех объектов из базы данных в настоящее время. Вроде как бежать

SELECT * FROM TABLE_NAME

Вы можете свободно перевести его как «получить все объекты (строки) модели (сущности)». Так что теперь это то, что мы сделаем, чтобы выполнить операции CRUD в нашей базе данных. Теперь, когда у нас есть наши данные в качестве объектов Python, мы можем делать всевозможные логики на них, что делает его шаблоном на передний конец, выполнять манипуляции на данные и т. Д. Каждый элемент в базе данных – ничто, кроме объекта Python, а для доступа к любому атрибуту этой строки все, что мы делаем, это относиться к нему, так как мы будем регулярным объектом Python I.E.: Object.attribute. Позвольте мне показать, что я имею в виду:

Python 3.7.1 (default, Dec 14 2018, 19:28:38) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from products.models import Products
>>> all_products = Products.objects.all()
>>> for product in all_products:
...     print(product.id, "--", product.title, "--", product.price, "--", product.product_category)
... 
2 -- Sample Item -- 1.00 -- True
3 -- ABCD Item -- 300.00 -- CLOTH
4 -- XYZ Items -- 100.00 -- HOME
5 -- PQRST -- 33.00 -- STAT
>>> 

Смотрите, строка базы данных не отличается от экземпляра класса модели, а имена поля являются его атрибутами. Мы можем сделать все вещи, которые вы будете делать в обычной базе данных SQL, используя Queryset s. Например:

>>> all_products = Products.objects.filter(product_category='HOME')
>>> for product in all_products:
...     print(product.id, "--", product.title, "--", product.price, "--", product.product_category)
... 
4 -- XYZ Items -- 100.00 -- HOME

эквивалентно: Черт, вы даже можете создавать, удалять, обновлять объекты (или это строки, трудно сказать: P) с этими API, и это то, что мы делаем в приложениях. Например, (каламбур предназначен), мы могли бы использовать последний пример петли для визуализации страницы списка продукта на веб-сайте Real E-Commerce. Как я уже сказал, Документы фантастические.

Снимитесь с ума, постройте что-нибудь, чтобы улучшить свою жизнь или другие жизни!

Оригинал: “https://dev.to/pallabganguly/playing-with-django-models-cjo”