6. diel - Databáza filmov v Django - Databáza
V minulej lekcii, Databáza filmov v Django - Vytvorenie projektu a static files , sme začali tvorbu nového projektu, ktorým je webová databáza filmov.
V nasledujúcom tutoriále webových aplikácií s frameworkom Django v Pythone pokročíme v tvorbe našej aplikácie - Filmovej databázy. Zatiaľ máme v aplikácii vytvorenú šablónu a dáta o filme sme jej odovzdali ako zoznam. Samozrejme by bolo pekné mať dáta uložené v databáze, ako sa na správnu webovú aplikáciu pristane a patrí. A práve na databázu sa teraz zameriame. Vysvetlíme si ORM prístup, vytvoríme modely pre filmy a ich žánre, databázu zmigrujeme a naučíme sa pracovať s Django administráciou.
Databázy a Django
Ako databázu budeme používať SQLite, ktorá je v Django už prednastavená a nemusí sa na rozdiel od iných databáz inštalovať ani konfigurovať. Nutné minimum znalostí a základy práce s ňou si vysvetlíme priamo tu v kurze. Pokiaľ by sme však v budúcnosti vytvárali komplexnejšie aplikácie, je vhodnejšie použiť napr. databázu PostgreSQL alebo MySQL. Pre nás by ale teraz predstavovali zbytočné úsilie navyše.
Objektovo relačné mapovanie
S databázou budeme pracovať pomocou tzv. ORM – objektovo
relačného mapovania. Znie to síce veľmi odborne, ale v skutočnosti nám
tento prístup výrazne uľahčí prácu. My totiž budeme pracovať s objektmi
a Django ich bude sám na pozadí automaticky prevádzať na databázové
príkazy. Na vytvorenie databázových tabuliek nám teda postačí vytvoriť
triedy reprezentujúce databázové entity. Korešpondujúce tabuľky budú
neskôr založené automaticky. Ideme na to:-) Vytvorme si triedy
Film
a Zanr
.
Prejdime do súboru mysite\moviebook\models.py
a upravme jeho
obsah do nasledujúcej podoby:
from django.db import models class Film(models.Model): nazev = models.CharField(max_length=200) rezie = models.CharField(max_length=180) class Zanr(models.Model): film = models.ForeignKey(Film, on_delete=models.CASCADE) nazev_zanru = models.CharField(max_length=80)
Vidíme, že filmy majú názvy a réžiu, žánre majú filmy a názvy
žánrov. Okrem definície textových stĺpcov tu vidíme aj definíciu cudzieho
kľúča, teda väzby medzi dvoma databázovými tabuľkami, v našom prípade
väzbu žánru na film. Všimnime si tiež, že naše triedy dedia z
models.Model
. Vďaka tomu získajú napr. metódu
save()
, ktorá ich inštancie umožní uložiť do databázy. To si
vyskúšame za chvíľu.
Migrácia databázy
Úprave databázy tak, aby zodpovedala definícii modelov v našej aplikácii, sa hovorí migrácia. Tento proces musíme spustiť zakaždým, keď vykonáme zmenu v definícii dátovej štruktúry a potrebujeme, aby Django na jej základe databázu upravilo, v našom prípade dokonca vytvorilo.
Databázovú migráciu najprv vytvoríme príkazom v termináli v priečinku
mysite/
:
py manage.py makemigrations moviebook
Django nás odmení nasledujúcim výstupom:
Vytvoření migrace: Migrations for 'moviebook': moviebook\migrations\0001_initial.py - Create model Film - Create model Zanr
Potom migráciu spustíme:
py manage.py migrate
Výstupom bude:
Spuštění migrace: Operations to perform: Apply all migrations: admin, auth, contenttypes, moviebook, sessions Running migrations: Applying moviebook.0001_initial... OK
Django API
Teraz si ukážeme prácu s Django API, teda ako do databázy vkladať nové riadky ako objekty a ako objekty z databázy taktiež získavať. Ukážky vykonáme v interaktívnom shellu, ktorý spustíme pomocou:
py manage.py shell
A do neho napíšeme nasledujúci kód:
from moviebook.models import Film, Zanr muj_film = Film(nazev="Strazci Galaxie", rezie="James Gunn") # Vytvoříme si nový film muj_film.save() # Uloží film do DB muj_film.zanr_set.create(nazev_zanru="Fantasy/Action") # Vytvoří nový žánr k tomuto filmu nazev_zanru = muj_film.zanr_set.first().nazev_zanru # Získá žánr pro konkrétní instanci filmu
Shell ho vykoná bez viditeľného výstupu. Presvedčíme sa teda, že všetko prebehlo ako malo. Do shellu vložíme postupne tieto dva príkazy:
muj_film.nazev # Zobrazí název filmu nazev_zanru # Zobrazí název žánru
Vo výstupe vidíme film aj žáner:
Zobrazení objektů databáze:: In [2]: muj_film.nazev Out[2]: 'Strazci Galaxie' In [3]: nazev_zanru Out[3]: 'Fantasy/Action'
Rozšírenie modelov
Upravme teraz naše triedy v modeli tak, aby nám vracali názov a meno režiséra a názov žánru:
from django.db import models class Film(models.Model): nazev = models.CharField(max_length=200) rezie = models.CharField(max_length=180) def __str__(self): return "Nazev: {0} | Rezie: {1}".format(self.nazev, self.rezie) class Zanr(models.Model): film = models.ForeignKey(Film, on_delete=models.CASCADE) nazev_zanru = models.CharField(max_length=80) def __str__(self): return "Film: {0} | Nazev_zanru: {1}".format(self.film, self.nazev_zanru)
Pokiaľ sme stále v interaktívnom shellu, tak ho ukončíme príkazom
quit()
a spustíme novú reláciu príkazom
py manage.py shell
. Do shellu teraz vložíme:
from moviebook.models import Film, Zanr Film.objects.all() # Uvidíme název filmu i jméno režiséra muj_film = Film.objects.get(nazev="Strazci Galaxie") muj_film.zanr_set.all() # Zobrazí informace o filmu a také název žánru
Výstup v konzole:
Výpis záznamu v databázi::
<QuerySet [<Zanr: Film: Nazev: Strazci Galaxie | Rezie: James Gunn | Nazev_zanru: Fantasy/Action>]>
Administrácia databázy
Napokon sa dostávame k administrácii. Vytvoríme si tzv. superužívateľa (administračného užívateľa) cez ktorého databázu budeme môcť spravovať. Do konzoly zadáme:
py manage.py createsuperuser
Budeme vyzvaní na zadanie mena, emailu a hesla, zadajte vhodné údaje:
Vytvoření superživatele:
Username (leave blank to use 'tomse'):
Email address:
Password:
Password (again):
Superuser created successfully.
Superživateľa máme vytvoreného. Teraz je potrebné naše modely do
administrácie zaregistrovať. To urobíme úpravou súboru
\mysite\moviebook\admin.py
:
from django.contrib import admin from .models import Film, Zanr #Importujeme si modely #Modely registrujeme admin.site.register(Film) admin.site.register(Zanr)
Teraz si spustíme server a zamierime si to na adresu
http://localhost:8000/admin/
. Prihlasujeme sa ako superužívateľ
údajmi, ktoré sme si predtým zvolili. Po prihlásení sa nám naskytne
nasledujúci pohľad:
Všímavé do očí udrú Films
a Zanrs
, to
zmeníme neskôr. Otvoríme entity Films
a tam uvidíme náš film
s názvom Strazci Galaxie
. Všimnime si, že je nám vypísaná
návratová hodnota našej metódy __str__()
, ktorú sme si
vytvorili v \mysite\moviebook\models.py
, v prípade filmu teda jeho
názov, zvislítko a réžia:
Pokiaľ si entitu (film
) rozklikneme, môžeme tu editovať jeho
názov a meno režiséra. Pre ukážku si vytvoríme ďalší ľubovoľný film
(Films
-> tlačidlo Add Film
vpravo hore). Potom si
to namierime do sekcie Zanrs
a zobrazíme si detail o našom
súčasnom žánri. Pokiaľ sa pokúsime nastaviť žánru film, tak sa nám
tiež zobrazí náš nový film, ako môžeme pozorovať na nasledujúcom
obrázku:
V aplikácii máme teraz chybu, bolo by totiž logické, aby sa film viazal
na žáner a nie naopak. Otvoríme si preto náš databázový model pri
aplikácii moviebook
a reláciu zmeníme, pred týmto krokom
najlepšie zmažme všetky existujúce filmy a žánre. Aspoň si tým
precvičíme prácu s databázou. Odstránenie môžeme vykonať jednoducho cez
administráciu. Prejdeme do súboru \mysite\moviebook\models.py
,
ktorý upravíme do nasledujúcej podoby:
from django.db import models class Zanr(models.Model): nazev_zanru = models.CharField(max_length=80) def __str__(self): return "Nazev_zanru: {0}".format(self.nazev_zanru) class Film(models.Model): nazev = models.CharField(max_length=200) rezie = models.CharField(max_length=180) zanr = models.ForeignKey(Zanr, on_delete=models.SET_NULL, null=True) def __str__(self): return "Nazev: {0} | Rezie: {1} | Zanr: {2}".format(self.nazev, self.rezie, self.zanr.nazev_zanru)
Ďalej je potrebné vykonané zmeny modelu "premietnuť do databázy", preto použijeme nasledujúce, už známe, príkazy pre vytvorenie a spustenie migrácie:
py manage.py makemigrations moviebook py manage.py migrate
Teraz stačí server znova spustiť a vyskúšať si, že všetko funguje.
Ako prvý však musíme vytvoriť žáner, pretože sme zmenili vzťah medzi
filmami a žánrami (zanr
> film
) a film sa musí
na nejaký žáner viazať, aby mohol byť vytvorený. Pridanie filmu potom
vyzerá takto:
Výborne, všetko funguje, ako má. Určite nás už tiež nebaví pozerať
sa na skomolené slová „Films“ a „Zanrs“, a preto si trošku upravíme
modely Film
a Zanr
. Na to použijeme triedu
Meta
, ktorá slúži na ukladanie/nastavenie informácií
navyše, ako je v tomto prípade názov množného čísla entity nastaviteľný
pomocou "verbose_name_plural". Súbor \mysite\moviebook\models.py
ešte raz upravíme takto:
from django.db import models class Zanr(models.Model): nazev_zanru = models.CharField(max_length=80, verbose_name="Žánr") def __str__(self): return "Nazev_zanru: {0}".format(self.nazev_zanru) class Meta: verbose_name = "Žánr" verbose_name_plural = "Žánry" class Film(models.Model): nazev = models.CharField(max_length=200, verbose_name="Název Filmu") rezie = models.CharField(max_length=180, verbose_name="Režie") zanr = models.ForeignKey(Zanr, on_delete=models.SET_NULL, null=True, verbose_name="Žánr") def __str__(self): return "Nazev: {0} | Rezie: {1} | Zanr: {2}".format(self.nazev, self.rezie, self.zanr.nazev_zanru) class Meta: verbose_name = "Film" verbose_name_plural = "Filmy"
Namierime si to rovno do administrácie na
http://localhost:8000/admin/
, kde už môžeme pozorovať krásne
české pomenovanie našich modelov.
Údaje pre superužívateľov pre databázu v priloženom projekte sú nasledujúce: Username: karel, Password: heslojeveslo.
V ďalšej lekcii, Databáza filmov v Django - Generic Views a Formuláre , naprogramujeme prácu s databázou cez našej aplikácie pomocou generic views.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 128x (1.29 MB)
Aplikácia je vrátane zdrojových kódov v jazyku Python