1964
Comment:
|
4055
|
Deletions are marked like this. | Additions are marked like this. |
Line 56: | Line 56: |
Teraz ideme vytvoriť niekoľko žiakov a zaradiť ich do Tried. | Teraz ideme vytvoriť žiaka a (nevyhnutne) zaradiť ho do Triedy. |
Line 78: | Line 78: |
Preraďme žiaka Jan Prvy do tretej B: | |
Line 79: | Line 80: |
{{{#!python >>> tretia_B=Trieda.objects.get(rocnik=3,pismeno="B") >>> jan_prvy=Ziak.objects.get(meno="Jan",priezvisko="Prvy") >>> jan_prvy.trieda=tretia_B >>> jan_prvy.save() >>> }}} Ešte vytvoríme zopár žiakov {{{#!python >>> Ziak(meno="Jozef",priezvisko="Druhy",trieda=tretia_B).save() >>> Ziak(meno="Katarina",priezvisko="Tretia",trieda=tretia_B).save() >>> tretia_A=Trieda.objects.get(rocnik=3,pismeno="A") >>> Ziak(meno="Milan",priezvisko="Stvrty",trieda=tretia_A).save() >>> Ziak(meno="Jana",priezvisko="Piata",trieda=tretia_A).save() >>> Ziak(meno="Anna",priezvisko="Siesta",trieda=tretia_A).save() >>> }}} == Vypísanie žiakov patriacich do triedy == Prvý spôsob je jednoducho použiť filter na všetkých žiakov. {{{#!python >>> tretia_A=Trieda.objects.get(rocnik=3,pismeno="A") >>> ziaci_3A=Ziak.objects.filter(trieda=tretia_A) >>> print ziaci_3A [<Ziak: Milan Stvrty>, <Ziak: Jana Piata>, <Ziak: Anna Siesta>] >>> }}} Druhý spôsob je takto: {{{#!python >>> ziaci_3A=tretia_A.ziak_set.all() >>> print ziaci_3A [<Ziak: Milan Stvrty>, <Ziak: Jana Piata>, <Ziak: Anna Siesta>] >>> }}} 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č: {{{#!python class Predmet(models.Model): nazov=models.CharField(max_length=50) def __unicode__(self): return self.nazov }}} 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. {{{#!python class Ucitel(models.Model): meno=models.CharField(max_length=50) priezvisko=models.CharField(max_length=50) predmety=models.ManyToManyField(Predmet) def __unicode__(self): return u"%s %s" % (self.meno,self.priezvisko) }}} |
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.