4235
Comment:
|
6412
|
Deletions are marked like this. | Additions are marked like this. |
Line 113: | Line 113: |
Line 122: | Line 123: |
Skúsme si vypísať teraz všetky známky: {{{#!python >>> Znamka.objects.all() [<Znamka: Znamka object>, <Znamka: Znamka object>, <Znamka: Znamka object>] >>> }}} To nie je veľmi informatívne, ak chceme vypisovať známky trochu lepšie, dodajme do triedy Znamka metódu {{{__unicode__}}}: {{{#!python class Znamka(models.Model): # meno a priezvisko ziaka meno_ziaka=models.CharField(max_length=30) priezvisko_ziaka=models.CharField(max_length=30) # meno a priezvisko ucitela meno_ucitela=models.CharField(max_length=30) priezvisko_ucitela=models.CharField(max_length=30) # predmet, z ktoreho bola znamka udelena predmet=models.CharField(max_length=50) # znamka znamka=models.PositiveIntegerField() def __unicode__(self): return "%s : %d z %s" % (self.meno_ziaka,self.znamka,self.predmet) }}} Skúsme znovu: {{{#!python $ ./manage.py shell Python 2.5.2 (r252:60911, Jan 4 2009, 17:40:26) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from skola.ziacka.models import * >>> znamky=Znamka.objects.all() >>> print znamky [<Znamka: Jan : 3 z Matematika>, <Znamka: Jozef : 1 z Anglicky jazyk>, <Znamka: Anna : 1 z Telesna vychova>] >>> }}} Teraz Janovi zmeníme známku na objektívnejšiu: {{{#!python >>> zn_jano=znamky[0] >>> print zn_jano Jan : 3 z Matematika >>> zn_jano.znamka=2 >>> zn_jano.save() }}} A môžeme si znovu známky vypísať: {{{#!python >>> print znamky [<Znamka: Jan : 2 z Matematika>, <Znamka: Jozef : 1 z Anglicky jazyk>, <Znamka: Anna : 1 z Telesna vychova>] >>> }}} === Filtrovanie dát === Začnime skúmaním djangovských typov, ktoré nám umožňujú horeuvedené hry. Prvých dvoch hráčov poznáme, sú to * modely, t.j. podtriedy {{{django.db.models.Model}}} a * inštancie modelov. To ale nie je všetko: {{{#!python >>> type(Znamka.objects) <class 'django.db.models.manager.Manager'> >>> type(Znamka.objects.all()) <class 'django.db.models.query.QuerySet'> }}} |
Jednoduchý model a práca s ním
Django umožňuje pracovať s relačnou databázou pomocou objektovo-relačného modelu. Robí to pomocou techniky menom objektovo-relačné mapovanie (ORM). Z praktického hľadiska táto technika slúži na izolovanie programátora aplikácie od databázového servra, Je možné začať vyvíjať aplikáciu lokálne pod sqlite a v reálnom nasadení potom použiť povedzme Oracle, pričom jediná zmena je v settings.py. Programátor sa nemusí zaoberať SQL, stačí mu vedieť python.
Nevýhoda tejto techniky je v tom, že neumožňuje účinne používať mnohé techniky určené pre zvýšenie výkonnosti databázového servra (triggery a pod.). Primárnym účelom djanga je vytvárať dynamické webové stránky, ale napríklad veľká aplikácia ako napríklad http://is.stuba.sk vyžaduje trochu zložitejší návrh databázovej schémy, než to umožňuje django.
Vytvorenie modelu
Vytvorme si nový projekt s názvom skola a v ňom aplikáciu s názvom ziacka.
Ideme implementovať dátový model žiackej knižky naivným (a pre tento účel nesprávnym) spôsobom: ako jednu veľkú tabuľku s mnohými stĺpcami. Nesmieme zabudnúť doplniť aplikáciu v settings.py.
V adresári ziacka máme súbor models.py, ktorý vyzerá takto:
1 from django.db import models
2
3 class Znamka(models.Model):
4
5 # meno a priezvisko ziaka
6 meno_ziaka=models.CharField(max_length=30)
7 priezvisko_ziaka=models.CharField(max_length=30)
8 # meno a priezvisko ucitela
9 meno_ucitela=models.CharField(max_length=30)
10 priezvisko_ucitela=models.CharField(max_length=30)
11 # predmet, z ktoreho bola znamka udelena
12 predmet=models.CharField(max_length=50)
13 # znamka
14 znamka=models.PositiveIntegerField()
Napíšme teraz
$ ./manage.py syncdb
a všimnime si, že vo výpise máme takýto riadok
Creating table ziacka_znamka
Pre zaujímavosť sa môžeme pozrieť, aké SQL príkazy boli použité na vytvorenie tabuľky.
$ ./manage.py sqlall ziacka BEGIN; CREATE TABLE "ziacka_znamka" ( "id" integer NOT NULL PRIMARY KEY, "meno_ziaka" varchar(30) NOT NULL, "priezvisko_ziaka" varchar(30) NOT NULL, "meno_ucitela" varchar(30) NOT NULL, "priezvisko_ucitela" varchar(30) NOT NULL, "predmet" varchar(50) NOT NULL, "znamka" integer unsigned NOT NULL ) ; COMMIT;
Všimnite si
Vzniklo niečo, čo sme explicitne nepožadovali, a to stĺpec id.
- Názov tabuľky má ako prefix názov aplikácie. Preto nás nemusí trápiť, ak máme rovnako pomenované modely v dvoch rôznych aplikáciách.
Upozornenie
Ak by sme sa rozhodli teraz triedu Znamka zmeniť, ./manage.py syncdb už žiadne zmeny v databázovej tabuľke neurobí. Vie iba tabuľku vytvoriť, nie modifikovať. Z praktického hľadiska to znamená, že ak počas vývoja zmeníme model, musíme databázu vymazať. Preto je dobrý nápad mať malý pythonovský skript, ktorý naplní databázu vzorkou dát, aby sme to nemuseli opakovane robiť ručne. Takže pre znovuvytvorenie databázy potom už iba spustíme $ ./manage.py shell < data_script.py a hotovo. |
Do models.py môžeme pridať kedykoľvek novú triedu, vtedy mazať databázu nemusíme. |
Základná práca s modelom
Zapisovanie dát
Najprv si dáme náš model do globálneho namespace.
Vytvoríme si inštanciu modelu, t.j. riadok tabuľky:
Objekt z ešte nie je uložený v databáze. Aby sme ho uložili, musíme urobiť toto:
Analogicky pridáme do databázy ešte zo dve známky. Potom môžeme ukončiť pythonovský shell cez CTRL-D.
Čítanie dát
Skúsme si vypísať teraz všetky známky:
To nie je veľmi informatívne, ak chceme vypisovať známky trochu lepšie, dodajme do triedy Znamka metódu __unicode__:
1 class Znamka(models.Model):
2
3 # meno a priezvisko ziaka
4 meno_ziaka=models.CharField(max_length=30)
5 priezvisko_ziaka=models.CharField(max_length=30)
6 # meno a priezvisko ucitela
7 meno_ucitela=models.CharField(max_length=30)
8 priezvisko_ucitela=models.CharField(max_length=30)
9 # predmet, z ktoreho bola znamka udelena
10 predmet=models.CharField(max_length=50)
11 # znamka
12 znamka=models.PositiveIntegerField()
13
14 def __unicode__(self):
15 return "%s : %d z %s" % (self.meno_ziaka,self.znamka,self.predmet)
Skúsme znovu:
1 $ ./manage.py shell
2 Python 2.5.2 (r252:60911, Jan 4 2009, 17:40:26)
3 [GCC 4.3.2] on linux2
4 Type "help", "copyright", "credits" or "license" for more information.
5 (InteractiveConsole)
6 >>> from skola.ziacka.models import *
7 >>> znamky=Znamka.objects.all()
8 >>> print znamky
9 [<Znamka: Jan : 3 z Matematika>, <Znamka: Jozef : 1 z Anglicky jazyk>, <Znamka: Anna : 1 z Telesna vychova>]
10 >>>
Teraz Janovi zmeníme známku na objektívnejšiu:
A môžeme si znovu známky vypísať:
Filtrovanie dát
Začnime skúmaním djangovských typov, ktoré nám umožňujú horeuvedené hry.
Prvých dvoch hráčov poznáme, sú to
modely, t.j. podtriedy django.db.models.Model a
- inštancie modelov.
To ale nie je všetko: