Модели на Django
Това, което искаме да създадем сега, е нещо, което ще съхранява всички публикации в нашия блог. Но за да можем да направим това, трябва да поговорим малко за неща, наречени обекти
.
Обекти
Има концепция в програмирането, наречена обектно-ориентирано програмиране
. Идеята е, че вместо да пишем всичко като скучна последователност от инструкции за програмиране, можем да моделираме нещата и да определим как те си взаимодействат помежду си.
И така, какво е обект? Това е съвкупност от свойства и действия. Звучи странно, но ще ви дадем пример.
Ако искаме да моделираме котка, ще създадем обект Cat
, който има някои свойства като color
, age
, mood
(като добър, лош или сънен;)) и owner
(на който може да бъде назначен обект Person
- или може би в случай на бездомна котка, този свойство може да бъде празно).
Тогава Cat
има някои действия: purr
, scratch
или feed
(в този случай ще дадем на котката CatFood
, който може да бъде отделен обект със свойства, като taste
).
Cat
--------
color
age
mood
owner
purr()
scratch()
feed(cat_food)
CatFood
--------
taste
Така че в общи линии идеята е да се опишат реални неща в код със свойства (наречени свойства на обекта
) и действия (наречени методи
).
Как ще моделираме публикации в блогове тогава? Искаме да изградим блог, нали?
Трябва да отговорим на въпроса: Какво е публикация в блога? Какви свойства трябва да има?
Е, със сигурност нашата публикация в блога се нуждае от текст с нейното съдържание и заглавие, нали? Също така би било хубаво да знаем кой го е написал - така че се нуждаем от автор. И накрая, искаме да знаем кога публикацията е създадена и публикувана.
Post
--------
title
text
author
created_date
published_date
Какви неща могат да се направят с публикация в блог? Би било хубаво да има някакъв метод
, който публикува публикацията, нали?
Така че ще се нуждаем от метод publish
.
Тъй като вече знаем какво искаме да постигнем, нека започнем да го моделираме в Django!
Django model
Знаейки какво е обект, можем да създадем модел на Django за нашата публикация в блога.
Моделът в Django е специален вид обект - той се записва в database
. База данни е съвкупност от данни. Това е място, на което ще съхранявате информация за потребители, публикации в блога си и т.н. Ще използваме база данни SQLite, за да съхраняваме нашите данни. Това е адаптерът за база данни Django по подразбиране - това ще ни бъде достатъчно в момента.
Можете да мислите за модел в базата данни като електронна таблица с колони (полета) и редове (данни).
Създаване на приложение
За да поддържаме всичко подредено, ние ще създадем отделно приложение вътре в нашия проект. Много е хубаво да се организира всичко от самото начало. За да създадем приложение, трябва да стартираме следната команда в конзолата (от директорията djangogirls
, където е файлът manage.py
):
Mac OS X и Linux:
(myvenv) ~/djangogirls$ python manage.py startapp blog
Windows:
(myvenv) C:\Users\Name\djangogirls> python manage.py startapp blog
Ще забележите, че се създава нова директория blog
и сега съдържа редица файлове. Директориите и файловете в нашия проект трябва да изглеждат така:
djangogirls
├── blog
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── db.sqlite3
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── myvenv
│ └── ...
└── requirements.txt
След създаването на приложение също трябва да кажем на Django, че трябва да го използва. Правим това във файла mysite/settings.py
-- отваряме го във вашия редактор на кодове. Трябва да намерим INSTALLED_APPS
и да добавим ред, съдържащ 'blog.apps.BlogConfig'
. Така че крайният продукт трябва да изглежда така:
mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog.apps.BlogConfig',
]
Създаване на модел на блог публикация
Във файла blog/models.py
дефинираме всички обекти, наречени Models
- това е място, на което ще дефинираме нашата публикация в блога.
Нека да отворим blog/models.py
в редактора на кода, да премахнем всичко от него и да напишем код така:
blog/models.py
from django.conf import settings
from django.db import models
from django.utils import timezone
class Post(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
Проверете двукратно дали използвате два знака за подчертаване (
_
) от всяка страна наstr
. Тази конвенция се използва често в Python и понякога ги наричаме и „dunder“ (съкратено от „двойно-подчертаване“, "double-underscore").
Изглежда страшно, нали? Но не се притеснявайте - ще ви обясним какво означават тези редове!
Всички редове, започващи с from
или import
, са редове, които добавят части от други файлове. Така че вместо да копираме и поставяме едни и същи неща във всеки файл, можем да включим някои части с from ... import ...
.
class Post (models.Model):
- този ред дефинира нашия модел (това е object
).
class
е специална ключова дума, която показва, че дефинираме обект.Post
е името на нашия модел. Можем да му дадем различно име (но трябва да избягваме специални символи и бяло пространство). Винаги започвайте име на клас с главна буква.models.Model
означава, че публикацията е модел на Django, така че Django знае, че трябва да бъде записана в базата данни.
Сега дефинираме свойствата, за които говорихме: title
, text
, created_date
, published_date
и author
. За целта трябва да определим типа на всяко поле (текст ли е? Число? Дата? Отношение към друг обект, като User?)
models.CharField
-- по този начин определяте текст с ограничен брой знаци.models.TextField
-- това е за дълъг текст без ограничение. Звучи идеално за съдържание в блог, нали?models.DateTimeField
-- това е дата и час.models.ForeignKey
-- това е връзка към друг модел.
Тук няма да обясняваме всяка част от кода, тъй като това ще отнеме твърде много време. Трябва да разгледате документацията на Django, ако искате да знаете повече за моделните полета и как да дефинирате неща, различни от описаните по-горе (https://docs.djangoproject.com/en/2.2/ref/models/fields/#field -types).
Какво ще кажете за def publish(self):
? Това е точно методът publish
, за който говорихме преди. def
означава, че това е функция/метод и publish
е името на метода. Можете да промените името на метода, ако искате. Правилото за именуване е, че използваме малки букви и подчертавки вместо интервали (прасни места). Например метод, който изчислява средна цена, може да се нарече calculate_average_price
.
Методите често връщат
нещо. Има пример за това в метода __str__
. В този сценарий, когато извикаме __str __ ()
, ще получим текст (string) със заглавие на публикацията.
Също така забележете, че и двете def publish(self):
и def __str__(self):
са отредени в нашия клас. Тъй като Python е чувствителен към бялото пространство, трябва да отстъпим методите си вътре в класа. В противен случай методите няма да принадлежат към класа и можете да получите някакво неочаквано поведение.
Ако нещо все още не е ясно за моделите, не се колебайте да попитате своя ментор! Знаем, че е сложно, особено когато научиш едновременно какво са обекти и функции. Но да се надяваме, че сега изглежда малко по-малко вълшебно за вас!
Създайте таблици за модели във вашата база данни
Последната стъпка тук е да добавим нашия нов модел към базата данни. Първо трябва да накараме Django да разбере, че имаме някои промени в нашия модел. (Току-що го създадохме!) Отидете до прозореца на вашата конзола и напишете python manage.py makemigrations blog
. Ще изглежда така:
command-line
(myvenv) ~/djangogirls$ python manage.py makemigrations blog
Migrations for 'blog':
blog/migrations/0001_initial.py:
- Create model Post
Забележка: Не забравяйте да запазите файловете, които редактирате. В противен случай компютърът ви ще изпълни предишната версия, която може да ви даде неочаквани съобщения за грешка.
Django подготви миграционен файл за нас, който сега трябва да приложим към нашата база данни. Въведете python manage.py migrate blog
и изходът трябва да бъде както следва:
command-line
(myvenv) ~/djangogirls$ python manage.py migrate blog
Operations to perform:
Apply all migrations: blog
Running migrations:
Applying blog.0001_initial... OK
Ура! Моделът ни на публикация вече е в нашата база данни! Би било хубаво да го видите, нали? Преминете към следващата глава, за да видите как изглежда вашата публикация!