Django modely
Nyní chceme vytvořit něco, co bude ukládat všechny příspěvky na náš blog. Ale abychom to mohly udělat, musíme si nejdříve říct něco o objektech.
Objekty
V programování se používá koncept zvaný objektově orientované programování. Tato myšlenka předpokládá, že místo psaní všeho jako nudný sled programovacích instrukcí můžeme modelovat věci a definovat, jak komunikují mezi sebou navzájem.
Co tedy je objekt? Je to kolekce vlastností a činností. Zní to divně, ale dáme ti příklad.
Pokud chceme modelovat kočku, vytvoříme objekt kočka, který má nějaké vlastnosti, například barva, věk, nálada (ta je dobrá, špatná, ospalá ;)), vlastník (který je objektem osoba nebo je možný případ zatoulané kočky, kde bude tato vlastnost prázdná).
Kočka má také některé akce: předení, škrábání nebo žraní (v němž dáváme kočce nějaké kočičí granule, které by mohlo být samostatný objekt s vlastnostmi, například chuť).
Cat
--------
color
age
mood
owner
purr()
scratch()
feed(cat_food)
CatFood
--------
taste
Základní představa je popsat skutečné věci v kódu vlastnostmi (nazývané vlastnosti objektu/object properties) a akcemi (nazývané metody/methods).
Jak tedy bude vypadat model blogu?
Musíme odpovědět na otázku: Co je blog post/příspěvek? Jaké by měl mít vlastnosti?
Určitě budeme v naše blogu potřebovat nějaký text s jeho obsahem a titulkem, že? Bylo by také dobré vědět, kdo příspěvek napsal, takže potřebujeme autora. Nakonec také chceme vědět, kdy byl příspěvek vytvořen a publikován.
Post
--------
title
text
author
created_date
published_date
Jaký druh věcí můžeme s příspěvkem dělat? Bylo by hezké mít nějakou metodu, která publikuje příspěvek.
Takže budeme potřebovat metodu publish.
Vzhledem k tomu, že už víme, čeho chceme dosáhnout, můžeme začít modelování v Djangu!
Django model
Nyní víme, jaký objekt chceme vytvořit, takže můžeme přistoupit k tvorbě Django modelu pro náš příspěvek v blogu.
Model v Django je zvláštní druh objektu - který je uložen v databázi. Databáze je soubor dat. Je to místo, kam budeš ukládat informace o uživatelích a tvých příspěvcích v blogu, atd. Budeme používat SQLite databázi k ukládání dat. To je výchozí databázový adaptér v Djangu – to nám bude nyní stačit.
Model v databázi si lze představit jako tabulku s řádky (data) a sloupci (údaje).
Vytvoření aplikace
Abychom udržely pořádek, vytvoříme si samostatnou aplikaci uvnitř našeho projektu. Je velmi příjemné mít všechno zorganizované od samého začátku. Chceš-li vytvořit novou aplikaci, je třeba spustit následující příkaz v konzoli (z djangogirls adresáře, kde je manage.py soubor):
(myvenv) ~/djangogirls$ python manage.py startapp blog
Zjistíš, že nový adresář blog nyní obsahuje řadu souborů. Adresáře a soubory v našem projektu by měly vypadat následovně:
djangogirls
├── mysite
| __init__.py
| settings.py
| urls.py
| wsgi.py
├── manage.py
└── blog
├── migrations
| __init__.py
├── __init__.py
├── admin.py
├── models.py
├── tests.py
└── views.py
Po vytvoření aplikace musíš také Djangu říct, že by ji měl použít. Uděláme to v souboru mysite/settings.py. Musíme najít INSTALLED_APPS a přidat řádek, který bude obsahovat "blog", ). Takže konečná konfigurace by měla vypadat takto:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
Vytvoření modelu pro blog post
V souboru blog/models.py budeme definovat všechny objekty nazývané modely - na tomto místě budeme definovat náš blog post.
Otevři blog/models.py, odstraň vše, co v něm je, a vlož následující kód:
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
Dvakrát si zkontroluj, že jsi použila dva znaky podtržítko(
_) na každé straněstr. Tato konvence se v Pythonu používá často. Někdy je také nazýváme "dunder" (zkratka pro "Double-UNDERscore").
Vypadá to děsivě, že? Ale žádný strach, vysvětlíme ti, co tyto řádky znamenají!
Všechny řádky začínající from nebo import jsou řádky, které přidávají některé kousky z jiných souborů. Takže namísto kopírování a vkládání stejných věcí v každém souboru, můžeš zahrnout některé části s from... import....
class Post(models.Model): - Tento řádek definuje náš model (Jedná se o objekt).
classje speciální klíčové slovo, které říká, že definujeme objekt.Postje jméno našeho modelu, můžeme mu dát jiné jméno (ale musíme se vyvarovat speciálních znaků a bílých znaků). Název třídy vždy začínej velkým písmenem.models. Modelznamená, že Post je Django Model, takže Django ví, že by to mělo být uloženo v databázi.
Nyní definujeme vlastnosti, mluvily jsme o: title, text, created_date, published_date a autor. To uděláš tak, že definuješ typ každého pole (Je to text? Číslo? Datum? Vztah k jinému objektu, například uživateli?).
models. CharField- takto definuješ text s omezeným počtem znaků.models. TextField- toto použiješ na dlouhý text bez omezení. To zní ideálně pro obsah blog post, ne?models. DateTimeField- definuje datum a čas.models. ForeignKey- definuje odkaz do jiného modelu.
Nebudeme vysvětlovat každý kousek kódu, vzhledem k tomu, že by trvalo příliš dlouho. Měla bys se podívat do Django dokumentace, pokud se chceš dozvědět víc o polích modelu a jak definovat jiné věci než výše uvedené (https://docs.djangoproject.com/en/1.8/ref/models/fields/#field-types).
Co je def publish(self):? Je to publish metoda, o které jsme mluvili dříve. def znamená, že definuješ funkci/metodu, a publish je název metody. Název metody můžeš změnit, pokud chceš. Pravidlo pro pojmenovávání je, že používáme malá písmena a podtržítka místo mezer. Například metoda, která vypočítá průměrnou cenu, se bude jmenovat calculate_average_price.
Metody často něco vrací/return. Zde je příklad metoda __str__. V tomto případě, když zavoláme metodu __str__(), dostaneme text (řetězec/string) s názvem Postu.
Pokud ti něco stále ještě není jasné o modelech, neváhej se zeptat svého kouče! Víme, že je to složité, zvláště, když se dozvíte, co jsou objekty a funkce takto naráz. Doufejme, že to je nyní pro tebe trochu méně magické!
Vytvoření tabulek pro modely v databázi
V posledním kroku přidáš náš nový model do databáze. Nejprve musíme dát Djangu vědět, že mám nějaké změny v modelu (které jsme právě vytvořily!). Napiš Python manage.py makemigrations blog. Celý příkaz bude vypadat takto:
(myvenv) ~/djangogirls$ python manage.py makemigrations blog
Migrations for 'blog':
0001_initial.py:
- Create model Post
Django pro nás připravil soubor migrace, který budeme muset aplikovat na naši databázi. Napiš Python manage.py migrate blog a výstup by měl vypadat takto:
(myvenv) ~/djangogirls$ python manage.py migrate blog
Operations to perform:
Apply all migrations: blog
Running migrations:
Rendering model states... DONE
Applying blog.0001_initial... OK
Hurá! Náš Post model je nyní v naší databázi! Bylo by hezké vidět ho v akci, že ano? Přeskoč na další kapitolu a podívej se, jak vypadá tvůj příspěvek!