5374
Comment:
|
5871
|
Deletions are marked like this. | Additions are marked like this. |
Line 177: | Line 177: |
ešte nie je funkčné. | ešte nie je funkčné. V pozadí celej veci je totiž nová tabuľka obsahujúca dvojice {{{ (id_ucitel,id_predmet) }}}. |
Line 185: | Line 185: |
Vidíme, že {{{ih.predmety}}} je akýsi {{{Manager}}}. Robíme s ním podobne, ako s managerom modelu: {{{#!python >>> ih.predmety.all() [] >>> ih.predmety.add(matika) >>> ih.predmety.add(fyzika) >>> ih.predmety.all() [<Predmet: Matematika>, <Predmet: Fyzika>] >>> ih.predmety.filter(nazov__contains="M") [<Predmet: Matematika>] >>> }}} Podobne pridáme ďalších učiteľov. |
Zložitejší model
Uchovávať dáta v jedinom modeli nie je väčšinou výhodné. Model, ktorý sme použili v predošlom prípade má mnoho zásadných nevýhod.
Na prvý pohľad vidno, že dáta sú v ňom duplicitné. Teda ak budeme chcieť zmeniť nejaký údaj (meno učiteľa napríklad) musíme to urobiť na mnohých miestach.
Teraz si ukážeme lepší prístup
Trieda a žiak
Začnime Triedou.
Toto je jednoduché, nič nové sa nedozvedáme.
Trieda Ziak je zaujímavejšia.
Vidíme, že obsahuje referenciu na Triedu. Žiak patrí do jedinej Triedy.
Ukážme si, ako sa s týmito modelmi dá pracovať.
Vytvorme zopár Tried.
Teraz ideme vytvoriť žiaka a (nevyhnutne) zaradiť ho do Triedy.
Jan Prvy bol zaradený do 3.A triedy. Všimnite si, že print z.trieda nám volá metódu Trieda.__unicode__. Fakticky, z.trieda je typu trieda:
Preraďme žiaka Jan Prvy do tretej B:
Ešte vytvoríme zopár žiakov
1 >>> Ziak(meno="Jozef",priezvisko="Druhy",trieda=tretia_B).save()
2 >>> Ziak(meno="Katarina",priezvisko="Tretia",trieda=tretia_B).save()
3 >>> tretia_A=Trieda.objects.get(rocnik=3,pismeno="A")
4 >>> Ziak(meno="Milan",priezvisko="Stvrty",trieda=tretia_A).save()
5 >>> Ziak(meno="Jana",priezvisko="Piata",trieda=tretia_A).save()
6 >>> Ziak(meno="Anna",priezvisko="Siesta",trieda=tretia_A).save()
7 >>>
Vypísanie žiakov patriacich do triedy
Prvý spôsob je jednoducho použiť filter na všetkých žiakov.
Druhý spôsob je takto:
Otázka je, čo je rýchlejšie. Odpoveď v tejto chvíli nepoznám, závisí to od toho, ako inteligentne django ošetrí prvý spôsob. Som si istý, že druhý spôsob nie je pomalší ako prvý.
Predmety a učitelia
Predmet nemá referencie na nič:
Vzťah medzi predmetmi a učiteľmi je iný ako medzi žiakmi a triedami; žiak patrí do jedinej triedy ale predmet je spravidla učený viacerými učiteľmi, a aj učiteľ učí viac predmetov.
Predpokladajme, že predmety sme už vytvorili.
Ideme vytvoriť učiteľa.
1 >>> matika=Predmet.objects.get(nazov="Matematika")
2 >>> fyzika=Predmet.objects.get(nazov="Fyzika")
3 >>> telak=Predmet.objects.get(nazov="Telocvik")
4 >>> ih=Ucitel(meno="Ivan",priezvisko="Hrozny")
5 >>> type(ih.predmety)
6 Traceback (most recent call last):
7 File "<console>", line 1, in <module>
8 File "/var/lib/python-support/python2.5/django/db/models/fields/related.py", line 563, in __get__
9 target_col_name=qn(self.field.m2m_reverse_name())
10 File "/var/lib/python-support/python2.5/django/db/models/fields/related.py", line 375, in __init__
11 raise ValueError("%r instance needs to have a primary key value before a many-to-many relationship can be used." % instance.__class__.__name__)
12 ValueError: 'Ucitel' instance needs to have a primary key value before a many-to-many relationship can be used.
13 >>>
Problém je v tom, že sme nezavolali ih.save(). Teda ih.id ešte neexistuje a ih.predmety ešte nie je funkčné. V pozadí celej veci je totiž nová tabuľka obsahujúca dvojice (id_ucitel,id_predmet) .
Vidíme, že ih.predmety je akýsi Manager. Robíme s ním podobne, ako s managerom modelu:
Podobne pridáme ďalších učiteľov.