Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

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:

Databázová administrácia Django aplikácie v Python - Tvorba webov v Django frameworku pre Python - Tvorba webov v Django frameworku pre Python

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:

Výpis entít v databázovej administrácii Django frameworku pre Python - Tvorba webov v Django frameworku pre Python - Tvorba webov v Django frameworku pre Python

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:

Úprava entít v databázovej administrácii Django frameworku pre Python - Tvorba webov v Django frameworku pre Python - Tvorba webov v Django frameworku pre Python

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:

Pridanie entity v databázovej administrácii Django frameworku pre Python. - Tvorba webov v Django frameworku pre Python - Tvorba webov v Django frameworku pre Python

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/nas­tavenie informácií navyše, ako je v tomto prípade názov množného čísla entity nastaviteľný pomocou "verbose_name_plu­ral". 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

 

Predchádzajúci článok
Databáza filmov v Django - Vytvorenie projektu a static files
Všetky články v sekcii
Tvorba webov v Django frameworku pre Python
Preskočiť článok
(neodporúčame)
Databáza filmov v Django - Generic Views a Formuláre
Článok pre vás napísal MQ .
Avatar
Užívateľské hodnotenie:
1 hlasov
Používám hlavně Python a zajímám se o Deep Learning a vše kolem.
Aktivity