2196
Comment:
|
5374
|
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 87: | Line 87: |
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) }}} Predpokladajme, že predmety sme už vytvorili. {{{#!python >>> print Predmet.objects.all() [<Predmet: Matematika>, <Predmet: Fyzika>, <Predmet: Telocvik>] }}} Ideme vytvoriť učiteľa. {{{#!python >>> matika=Predmet.objects.get(nazov="Matematika") >>> fyzika=Predmet.objects.get(nazov="Fyzika") >>> telak=Predmet.objects.get(nazov="Telocvik") >>> ih=Ucitel(meno="Ivan",priezvisko="Hrozny") >>> type(ih.predmety) Traceback (most recent call last): File "<console>", line 1, in <module> File "/var/lib/python-support/python2.5/django/db/models/fields/related.py", line 563, in __get__ target_col_name=qn(self.field.m2m_reverse_name()) File "/var/lib/python-support/python2.5/django/db/models/fields/related.py", line 375, in __init__ raise ValueError("%r instance needs to have a primary key value before a many-to-many relationship can be used." % instance.__class__.__name__) ValueError: 'Ucitel' instance needs to have a primary key value before a many-to-many relationship can be used. >>> }}} 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é. {{{#!python >>> ih.save() >>> print ih.predmety <django.db.models.fields.related.ManyRelatedManager object at 0xa13fdac> >>> }}} |
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é.