| 
  
   Size: 5374 
  
  Comment:  
 | 
  
   Size: 5662 
  
  Comment:  
 | 
| Deletions are marked like this. | Additions are marked like this. | 
| 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>] >>> }}}  | 
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é.
Vidíme, že ih.predmety je akýsi Manager. Robíme s ním podobne, ako s managerom modelu:

