Changeset 49
- Timestamp:
- 04/21/08 22:07:50 (5 months ago)
- Files:
-
- django-docs/tutorial01.txt (modified) (23 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django-docs/tutorial01.txt
r37 r49 10 10 Składa się on z dwóch części: 11 11 12 * Publicznej - gdzie wyświetlane są ankiety i można na nie głosować. 12 * Publicznej - gdzie wyświetlane są ankiety i można na nie głosować. 13 13 * Administracyjnej - która pozwala na dodawanie, edytowanie i usuwanie ankiet. 14 14 … … 23 23 24 24 Jeśli masz problemy podczas przerabiania tego tutoriala, możesz napisać 25 wiadomość na `django-users`_ lub dołączyć do kanału `#django`_ na serwerze26 ``irc.freenode.net`` gdzie spróbujemy Ci pomóc.25 wiadomość na `django-users`_ lub dołączyć do kanału `#django`_ na serwerze 26 ``irc.freenode.net`` gdzie spróbujemy Ci pomóc. 27 27 28 28 .. _django-users: http://groups.google.com/group/django-users … … 55 55 56 56 Powinieneś unikać nazywania projektów nazwami wbudowanych w Pythona lub 57 nazwami komponentów Django. W szczególności oznacza to unikanie nazw takich58 jak ``django`` (która będzie kolidować z samym Django) lub ``site`` (która57 nazwami komponentów Django. W szczególności oznacza to unikanie nazw takich 58 jak ``django`` (która będzie kolidować z samym Django) lub ``site`` (która 59 59 spowoduje konflikt z wbudowanym w Pythona pakietem). 60 60 … … 69 69 70 70 Jeśli w przeszłości programowałeś w PHP, najprawdopodobniej przywykłeś do 71 umieszczania swojego kodu w ``document root`` swojego serwera www (w miejscu72 takim jak ``/var/www``). Z Django nie powinieneś tego robić. Nie jest dobrym73 pomysłem umiejscawianie jakiegokolwiek kodu Pythona wewnątrz74 ``document root``, ponieważ stwarza to zagrożenie możliwości oglądania75 Twojego kodu przez odwiedzających. Nie jest do dobre ze względów76 bezpieczeństwa.77 78 Umieść swój kod w którymkolwiek katalogu **poza** ``document root``, w takim79 jak np. ``/home/mycode``.71 umieszczania swojego kodu w ``document root`` swojego serwera www (w miejscu 72 takim jak ``/var/www``). Z Django nie powinieneś tego robić. Nie jest dobrym 73 pomysłem umiejscawianie jakiegokolwiek kodu Pythona wewnątrz 74 ``document root``, ponieważ stwarza to zagrożenie możliwości oglądania 75 Twojego kodu przez odwiedzających. Nie jest do dobre ze względów 76 bezpieczeństwa. 77 78 Umieść swój kod w którymkolwiek katalogu **poza** ``document root``, w takim 79 jak np. ``/home/mycode``. 80 80 81 81 Zobaczmy zatem co utworzył nam ``startproject``:: … … 90 90 91 91 * ``__init__.py``: Pusty plik informujący Pythona o tym, że katalog 92 nadrzędny powinien być traktowany jako pakiet Pythona (zobacz `więcej na93 temat pakietów`_).92 nadrzędny powinien być traktowany jako pakiet Pythona (zobacz `więcej na 93 temat pakietów`_). 94 94 * ``manage.py``: Działające z linii poleceń narzędzie, które pozwala na 95 interakcję z projektem Django na różne sposoby.95 interakcję z projektem Django na różne sposoby. 96 96 * ``settings.py``: Ustawienia/konfiguracja dla tego projektu Django. 97 97 * ``urls.py``: Deklaracja adresów URL dla tego projektu Django; "mapa 98 serwisu" Twojej zbudowanej w oparciu o Django strony.98 serwisu" Twojej zbudowanej w oparciu o Django strony. 99 99 100 100 .. _więcej na temat pakietów: http://docs.python.org/tut/node8.html#packages … … 131 131 132 132 Domyślnie polecenie ``runserver`` uruchamia serwer deweloperski na porcie 133 8000. Jeśli chcesz zmienić port serwera, prześlij jego wartość jako argument134 przy wywołaniu z linii poleceń. Dla przykładu - to polecenie uruchamia135 serwer na porcie 8080::133 8000. Jeśli chcesz zmienić port serwera, prześlij jego wartość jako argument 134 przy wywołaniu z linii poleceń. Dla przykładu - to polecenie uruchamia 135 serwer na porcie 8080:: 136 136 137 137 python manage.py runserver 8080 138 138 139 139 Pełna dokumentacja dla serwera deweloperskiego znajduje się na stronie 140 `dokumentacji panelu admina`_.141 142 .. _dokumentacji panelu admina: ../django-admin/140 `dokumentacji panelu admina`_. 141 142 .. _dokumentacji panelu admina: http://www.djangoproject.com/documentation/django-admin/ 143 143 144 144 Ustawienia bazy danych … … 152 152 Inne backendy są `również dostępne`_. 153 153 * ``DATABASE_NAME`` -- Nazwa Twojej bazy danych, bądź absolutna ścieżka do 154 pliku bazy danych, jeśli używasz SQLite.154 pliku bazy danych, jeśli używasz SQLite. 155 155 * ``DATABASE_USER`` -- Nazwa użytkownika uprawnionego do połączenia z bazą 156 danych (nie używane w SQLite).156 danych (nie używane w SQLite). 157 157 * ``DATABASE_PASSWORD`` -- hasło dostępu do bazy danych (nie używane w 158 SQLite).159 * ``DATABASE_HOST`` -- Adres serwera bazy danych. Możesz zostawić puste160 jeśli serwer bazy danych znajduje się na tym samym komputerze co Twoja161 aplikacja (nie używane w SQLite).162 163 .. _również dostępne: ../settings/158 SQLite). 159 * ``DATABASE_HOST`` -- Adres serwera bazy danych. Możesz zostawić puste 160 jeśli serwer bazy danych znajduje się na tym samym komputerze co Twoja 161 aplikacja (nie używane w SQLite). 162 163 .. _również dostępne: http://www.djangoproject.com/documentation/settings/ 164 164 165 165 .. admonition:: Uwaga 166 166 167 167 Jeśli używasz MySQL lub PostgreSQL, upewnij się że stworzyłeś potrzebną bazę 168 danych. Możesz to wykonać poleceniem "``CREATE DATABASE database_name;``"169 z wnętrza powłoki trybu aktywnego swojej bazy danych.168 danych. Możesz to wykonać poleceniem "``CREATE DATABASE database_name;``" 169 z wnętrza powłoki trybu aktywnego swojej bazy danych. 170 170 171 171 Edytując plik ``settings.py`` zwróć uwagę na ustawienia ``INSTALLED_APPS`` … … 182 182 * ``django.contrib.sessions`` -- Framework sesji. 183 183 * ``django.contrib.sites`` -- Framework do zarządzania wieloma stronami w 184 jednej instalacji Django.184 jednej instalacji Django. 185 185 186 186 Te aplikacje są dołączane domyślnie w ramach wygody dla powszechnych przypadków … … 194 194 Komenda ``syncdb`` patrzy na ustawienia ``INSTALLED_APPS`` i tworzy wszystkie 195 195 potrzebne tabele w bazie z uwzględnieniem ustawień odnośnie baz danych w Twoim 196 pliku ``settings.py` . Powinieneś zobaczyć informację o każdej utworzonej przez196 pliku ``settings.py``. Powinieneś zobaczyć informację o każdej utworzonej przez 197 197 niego tabeli i otrzymać zapytanie o utworzenie konta superużytkownika dla 198 198 systemu uwierzytelniania. Możesz śmiało na to się zgodzić. … … 204 204 .. admonition:: Dla minimalistów 205 205 206 Jak wcześniej wspomnieliśmy, domyślne aplikacje są dołączone dla207 najpowszechniejszych zastosowań, ale nie każdy ich potrzebuje. Jeśli nie208 potrzebujesz którejś lub wszystkich możesz zwyczajnie je zakomentować lub209 usunąć odpowiadające jej/im linie z ``INSTALLED_APPS`` przed uruchomieniem210 ``syncdb``. Komenda ``syncdb`` utworzy jedynie tabele dla aplikacji211 wymienionych w ``INSTALLED_APPS``.206 Jak wcześniej wspomnieliśmy, domyślne aplikacje są dołączone dla 207 najpowszechniejszych zastosowań, ale nie każdy ich potrzebuje. Jeśli nie 208 potrzebujesz którejś lub wszystkich możesz zwyczajnie je zakomentować lub 209 usunąć odpowiadające jej/im linie z ``INSTALLED_APPS`` przed uruchomieniem 210 ``syncdb``. Komenda ``syncdb`` utworzy jedynie tabele dla aplikacji 211 wymienionych w ``INSTALLED_APPS``. 212 212 213 213 Tworzenie modeli … … 231 231 232 232 Jaka jest różnica pomiędzy projektem a aplikacją? Aplikacja coś robi -- jest 233 nią np. system blogowy, rejestr danych publicznych lub prosta ankieta.234 Projekt jest kolekcją konfiguracji i aplikacji dla określonej strony www.235 Projekt może zawierać wiele aplikacji. Dana aplikacja może być w wielu236 projektach.233 nią np. system blogowy, rejestr danych publicznych lub prosta ankieta. 234 Projekt jest kolekcją konfiguracji i aplikacji dla określonej strony www. 235 Projekt może zawierać wiele aplikacji. Dana aplikacja może być w wielu 236 projektach. 237 237 238 238 W tym tutorialu dla ułatwienia utworzymy aplikację ankiety w katalogu … … 302 302 303 303 .. _dokumentację instalacyjną: ../install/ 304 .. _tutoriala dla Django 0.96: ../0.96/tutorial01/ 304 .. _tutoriala dla Django 0.96: 305 305 306 306 307 Kod jest samowyjaśniający się. Każdy model jest reprezentowany przez podklasę, … … 334 335 wiele-do-wielu (many-to-many) i jeden-do-jednego (one-to-one). 335 336 336 .. _` Python path`: http://docs.python.org/tut/node8.html#SECTION008110000000000000000337 .. _ DRY Principle: http://c2.com/cgi/wiki?DontRepeatYourself337 .. _`ścieżce dostępu pythona`: http://docs.python.org/tut/node8.html#SECTION008110000000000000000 338 .. _Regułą DRY: http://c2.com/cgi/wiki?DontRepeatYourself 338 339 339 340 Aktywacja modeli … … 344 345 345 346 * Stworzyć strukturę bazy danych (wygenerować kwerendy ``CREATE TABLE``) 346 dla tworzonej aplikacji.347 dla tworzonej aplikacji. 347 348 * Stworzyć API dostępu do bazy danych dla obiektów Poll i Choice. 348 349 … … 352 353 .. admonition:: Filozofia 353 354 354 Aplikcje Django są wtyczkami (pluginami): możesz używać ich w wielu355 projektach, a także rozpowszechniać, ponieważ nie są one przypisane do356 konkretnej instalacji Django.355 Aplikcje Django są wtyczkami (pluginami): możesz używać ich w wielu 356 projektach, a także rozpowszechniać, ponieważ nie są one przypisane do 357 konkretnej instalacji Django. 357 358 358 359 Wyedytuj ponownie plik ``settings.py``, i dopisz do ``INSTALLED_APPS`` … … 373 374 374 375 Treaz powinieneś zobaczyć następujący ciąg poleceń CREATE TABLE dla Twojej 375 sondy::376 ankiety:: 376 377 377 378 BEGIN; … … 394 395 395 396 * Nazwy tabel są generowane automatycznie poprzez kombinację nazwy aplikacji 396 (``polls``) i nazwy modelu zapisanej małymi literami -- ``poll`` i397 ``choice`` (możesz zmienić to domyślne zachowanie).397 (``polls``) i nazwy modelu zapisanej małymi literami -- ``poll`` i 398 ``choice`` (możesz zmienić to domyślne zachowanie). 398 399 399 400 * Klucze główne (ID) są dodawane automatycznie (aczkolwiek możesz to 400 zmienić).401 zmienić). 401 402 402 403 * Django dodaje końcówkę ``"_id"`` do zazw pól kluczy obcych 403 (``ForeignKey``). Również to zachowanie możesz jednak zmienić.404 404 (``ForeignKey``). Również to zachowanie możesz jednak zmienić. 405 405 406 * Powiązania z użyciem kluczy obcych są tworzone poprzez deklarację 406 ``REFERENCES``.407 407 ``REFERENCES``. 408 408 409 * To jest ściśle powiązane z bazą danych której używasz, więc polecenia 409 takie jak ``auto_increment`` (MySQL), `serial` (PostgreSQL) lub410 ``integer primary key`` (SQLite) specyficzne dla danego typu bazy są411 ustawiane automatycznie. To samo dotyczy się cytowania nazw pół --412 w zależności od bazy danych używa się pojedynczych bądź podwójnych413 cudzysłowów. Autor tego wprowadzenia używa PostgreSQL, tak więc przykłady414 są napisane dla tej bazy.410 takie jak ``auto_increment`` (MySQL), `serial` (PostgreSQL) lub 411 ``integer primary key`` (SQLite) specyficzne dla danego typu bazy są 412 ustawiane automatycznie. To samo dotyczy się cytowania nazw pół -- 413 w zależności od bazy danych używa się pojedynczych bądź podwójnych 414 cudzysłowów. Autor tego wprowadzenia używa PostgreSQL, tak więc przykłady 415 są napisane dla tej bazy. 415 416 416 417 * Komenda ``sql`` nie wykonuje zapytań SQL na twoje bazie danych - jedynie 417 drukuje je na ekranie byś mógł zobaczyć jaki SQL Django uważa na wymagany.418 Jeśli chcesz, możesz skopiować i wkleić ten fragment kodu SQL na wejście419 trybu interaktywnego swojej bazy danych. Jednakże, jak wkrótce zobaczymy,420 Django zapewnia prostą metodę zatwierdzania tego SQL-a do Twojej bazy421 danych.418 drukuje je na ekranie byś mógł zobaczyć jaki SQL Django uważa na wymagany. 419 Jeśli chcesz, możesz skopiować i wkleić ten fragment kodu SQL na wejście 420 trybu interaktywnego swojej bazy danych. Jednakże, jak wkrótce zobaczymy, 421 Django zapewnia prostą metodę zatwierdzania tego SQL-a do Twojej bazy 422 danych. 422 423 423 424 Jeśli jesteś zainteresowany, możesz także uruchomić poniższe komendy: 424 425 * ``python manage.py validate`` -- Sprawdza Twój model w poszukiwaniu 425 jakichkolwiek błędów konstrukcyjnych.426 426 jakichkolwiek błędów konstrukcyjnych. 427 427 428 * ``python manage.py sqlcustom polls`` -- Wypisuje wszelkie własne zapytania 428 SQL (takie jak modyfikacja tabeli lub ograniczenia (ang. constraints))429 które są definiowane przez aplikacje.429 SQL (takie jak modyfikacja tabeli lub ograniczenia (ang. constraints)) 430 które są definiowane przez aplikacje. 430 431 431 432 * ``python manage.py sqlclear polls`` -- Wypisuje wymagane wyrażenia 432 ``DROP TABLE`` dla tej aplikacji, biorąc pod uwagę aktualnie istniejące433 tabele w Twojej bazie danych (jeśli takowe istnieją).433 ``DROP TABLE`` dla tej aplikacji, biorąc pod uwagę aktualnie istniejące 434 tabele w Twojej bazie danych (jeśli takowe istnieją). 434 435 435 436 * ``python manage.py sqlindexes polls`` -- Wypisuje wyrażenie 436 ``CREATE INDEX`` dla tej aplikacji.437 ``CREATE INDEX`` dla tej aplikacji. 437 438 438 439 * ``python manage.py sqlall polls`` -- Kombinacja wszystkich wyjściowych 439 wartości wyrażeń SQL z poleceń 'sql', 'sqlcustom' i 'sqlindexes'.440 wartości wyrażeń SQL z poleceń 'sql', 'sqlcustom' i 'sqlindexes'. 440 441 441 442 Przejrzenie wyników powyższych komend pomoże Ci zrozumieć, co się dzieje … … 459 460 możliwościach ``manage.py``. 460 461 461 .. _ dokumentację django-admin.py: ../django-admin/462 .. _`dokumentację django-admin.py`: http://www.djangoproject.com/documentation/settings/django-admin/ 462 463 463 464 Zabawy z API … … 473 474 474 475 * Dodaniu ``mysite`` do ``sys.path``. Dla elastyczności, kilka fragmentów 475 Django odnosi się do projektów w Pythonie stosując notację z kropką476 (np. ``'mysite.polls.models'``). W związku z tym pakiet ``mysite`` musi477 znajdować się w ``system.path``.478 476 Django odnosi się do projektów w Pythonie stosując notację z kropką 477 (np. ``'mysite.polls.models'``). W związku z tym pakiet ``mysite`` musi 478 znajdować się w ``system.path``. 479 479 480 Niedawno widzieliśmy przykład takiego użycia: ``INSTALLED APPS`` 480 przechowuje listę pakietów we wspomnianej notacji z kropką.481 przechowuje listę pakietów we wspomnianej notacji z kropką. 481 482 482 483 * Ustawieniu zmiennej ``DJANGO_SETTINGS_MODULE``, która zapewnia Django 483 ścieżkę do Twojego pliku ``settings.py``.484 484 ścieżkę do Twojego pliku ``settings.py``. 485 485 486 .. admonition:: Praca bez wykorzystania manage.py 486 487 487 488 Jeśli nie chcesz używać ``manage.py`` nie ma problemu. Po prostu upewnij 488 się, że ``mysite`` na głównym poziomie ścieżki dostępu Pythona489 (``import mysite`` działa) i ustawia zmiennej środowiskowej490 ``DJANGO_SETTINGS_MODULE`` wartość ``mysite.settings``.491 489 się, że ``mysite`` na głównym poziomie ścieżki dostępu Pythona 490 (``import mysite`` działa) i ustawia zmiennej środowiskowej 491 ``DJANGO_SETTINGS_MODULE`` wartość ``mysite.settings``. 492 492 493 W celu uzyskania większej ilości informacji zobacz 493 `dokumentację django-admin,py`_.494 `dokumentację django-admin.py`_. 494 495 495 496 Gdy już będziesz w shellu zbadaj API bazy danych:: … … 510 511 511 512 # Teraz ma on swoje ID. Zauważ, że może ono mieć wartość "1L" zamiast "1", 512 # w zależności od tego jakiej bazy danych używasz. To jednak drobnostka;513 # oznacza to jedynie tyle, że Twoja baza danych woli zwracać typ integer514 # jako obiekt long integer Pythona.513 # w zależności od tego jakiej bazy danych używasz. To jednak drobnostka; 514 # oznacza to jedynie tyle, że Twoja baza danych woli zwracać typ integer 515 # jako obiekt long integer Pythona. 515 516 >>> p.id 516 517 1 … … 569 570 570 571 Jeśli jesteś obeznany z Pythonem, możesz mieć nawyk dodawania do swoich klas 571 metody ``__str__()`` a nie ``__unicode__()``. Używamy ``__unicode__()`` 572 ponieważ modele Django mają domyślnie do czynienia z unikodem. Wszelkie dane 573 trzymane w twojej bazie danych są konwertowane do unikodu zaraz po 574 ich wyciągnięciu. 575 576 Domyślna metoda ``__str__()`` modeli Django wywołuje ``__unicode__()`` i 577 konwertuje rezultat na bytestringa UTF-8. Oznacza to, że ``unicode(p)`` 578 zwraca ciąg znaków Unicode, zaś ``str(p)`` zwraca normalny ciąg znaków z 579 kodowany jako UTF-8. 580 581 If all of this is jibberish to you, just remember to add ``__unicode__()`` 582 methods to your models. With any luck, things should Just Work for you. 583 584 Note these are normal Python methods. Let's add a custom method, just for 585 demonstration:: 572 metody ``__str__()`` a nie ``__unicode__()``. Używamy ``__unicode__()`` 573 ponieważ modele Django mają domyślnie do czynienia z unikodem. Wszelkie dane 574 trzymane w twojej bazie danych są konwertowane do unikodu zaraz po 575 ich wyciągnięciu. 576 577 Domyślna metoda ``__str__()`` modeli Django wywołuje ``__unicode__()`` i 578 konwertuje rezultat na bytestringa UTF-8. Oznacza to, że ``unicode(p)`` 579 zwraca ciąg znaków Unicode, zaś ``str(p)`` zwraca normalny ciąg znaków z 580 kodowany jako UTF-8. 581 582 Jeśli wszystko co zostało wcześniej napisane nie ma dla Ciebie większego 583 sensu, po prostu pamiętaj dodać do swoich modeli metodę ``__unicode__()``. 584 Z odrobiną szczęścia wszystko powinno po prostu działać. 585 586 Zwróć uwagę, że są to zwykłe metody Pythona. Dla celów demonstracyjnych dodajmy 587 własną metodę:: 586 588 587 589 import datetime … … 592 594 return self.pub_date.date() == datetime.date.today() 593 595 594 Note the addition of ``import datetime`` to reference Python's standard 595 ``datetime`` module.596 597 Let's jump back into the Python interactive shell by running 598 ``python manage.py shell`` again::596 Zauważ, że dodatkowa linia ``import datetime`` odnosi się do standardowego 597 modułu Pythona ``datetime``. 598 599 Przejdźmy z powrotem do interaktywnej powłoki Pythona uruchamiając ponownie 600 ``python manage.py shell``:: 599 601 600 602 >>> from mysite.polls.models import Poll, Choice 601 603 602 # Make sure our __unicode__() addition worked.604 # Upewnij się że dodana przez nas metoda __unicode__() działa. 603 605 >>> Poll.objects.all() 604 [<Poll: What's up?>]605 606 # Django provides a rich database lookup API that's entirely driven by607 # keyword arguments.606 [<Poll: Jak leci?>] 607 608 # Django zapewnia bogate API bazy danych, które w całości napędzane jest 609 # nazywanymi argumentami 608 610 >>> Poll.objects.filter(id=1) 609 [<Poll: What's up?>] 610 >>> Poll.objects.filter(question__startswith='What') 611 [<Poll: What's up?>] 612 613 # Get the poll whose year is 2007. Of course, if you're going through this 614 # tutorial in another year, change as appropriate. 611 [<Poll: Jak leci?>] 612 >>> Poll.objects.filter(question__startswith='Jak') 613 [<Poll: Jak leci?>] 614 615 # Pobierz ankietę, której rok wynosi 2007. Oczywiście jeśli wcześniej 616 # w trakcie tego tutoriala wybrałeś inną datę, powinieneś w tym momencie 617 # wprowadzić odpowiednią wartość. 615 618 >>> Poll.objects.get(pub_date__year=2007) 616 <Poll: What's up?>619 <Poll: Jak leci?> 617 620 618 621 >>> Poll.objects.get(id=2) … … 621 624 DoesNotExist: Poll matching query does not exist. 622 625 623 # Lookup by a primary key is the most common case, so Django provides a 624 # shortcut for primary-key exact lookups. 625 # The following is identical to Poll.objects.get(id=1). 626 # Poszukiwanie obiektu na podstawie wartości klucza głównego jest 627 # najczęściej stosowanym przypadkiem, dlatego Django zapewnia odpowiednią 628 # metodę. 629 # Poniższe jest identyczne z Poll.objects.get(id=1). 626 630 >>> Poll.objects.get(pk=1) 627 <Poll: What's up?>628 629 # Make sure our custom method worked.631 <Poll: Jak leci?> 632 633 # Upewnij się że zdefiniowana przez Ciebie metoda działa. 630 634 >>> p = Poll.objects.get(pk=1) 631 635 >>> p.was_published_today() 632 636 False 633 637 634 # Give the Poll a couple of Choices. The create call constructs a new 635 # choice object, does the INSERT statement, adds the choice to the set 636 # of available choices and returns the new Choice object. 638 # Dołącz do ankiety (Poll) kilka odpowiedzi (Choices). Wywołanie 639 # konstruktora tworzy nowy obiekt odpowiedzi, wykonuje polecenie INSERT, 640 # dodaje odpowiedź do listy dostępnych odpowiedzi i zwraca nowy obiekt 641 # odpowiedzi (Choice). 637 642 >>> p = Poll.objects.get(pk=1) 638 >>> p.choice_set.create(choice='Not much', votes=0) 639 <Choice: Not much> 640 >>> p.choice_set.create(choice='The sky', votes=0) 641 <Choice: The sky> 642 >>> c = p.choice_set.create(choice='Just hacking again', votes=0) 643 644 # Choice objects have API access to their related Poll objects. 643 >>> p.choice_set.create(choice='Specjalnie nic nowego', votes=0) 644 <Choice: Specjalnie nic nowego> 645 >>> p.choice_set.create(choice='Ciurkiem', votes=0) 646 <Choice: Ciurkiem> 647 >>> c = p.choice_set.create(choice='Znowu programuję', votes=0) 648 649 # Obiekty wyboru (Choice) posiadają API zapewniające dostęp do związanych 650 # z nimi obiektami ankiety (Polls). 645 651 >>> c.poll 646 <Poll: What's up?>647 648 # And vice versa: Poll objects get access to Choice objects.652 <Poll: Jak leci?> 653 654 # I odwrotnie: obiekty Poll posiadają dostęp do obiektów Choice. 649 655 >>> p.choice_set.all() 650 [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]656 [<Choice: Specjalnie nic nowego>, <Choice: Ciurkiem>, <Choice: Znowu programuję>] 651 657 >>> p.choice_set.count() 652 658 3 653 659 654 # The API automatically follows relationships as far as you need. 655 # Use double underscores to separate relationships. 656 # This works as many levels deep as you want; there's no limit. 657 # Find all Choices for any poll whose pub_date is in 2007. 660 # Omawiane API automatycznie podąża za relacjami tak daleko jak tego 661 # potrzebujesz. Użyj podwójnego podkreślnika by oddzielić powiązania. 662 # Działa to dla tylu poziomów głębokości dla ilu chcesz - nie ma limitu. 663 # Znajdź wszystkie Odpowiedzi (Choices) dla każdej ankiety opublikowanej 664 # w roku 2007. 658 665 >>> Choice.objects.filter(poll__pub_date__year=2007) 659 [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]660 661 # Let's delete one of the choices. Use delete() for that.662 >>> c = p.choice_set.filter(choice__startswith=' Just hacking')666 [<Choice: Specjalnie nic nowego>, <Choice: Ciurkiem>, <Choice: Znowu programuję>] 667 668 # Usuń jedną z odpowiedzi. Użyj delete() aby tego dokonać. 669 >>> c = p.choice_set.filter(choice__startswith='Znowu program') 663 670 >>> c.delete() 664 671 665 For full details on the database API, see our `Database API reference`_. 666 667 When you're comfortable with the API, read `part 2 of this tutorial`_ to get 668 Django's automatic admin working. 669 670 .. _Database API reference: ../db-api/ 671 .. _part 2 of this tutorial: ../tutorial02/ 672 By uzyskać więcej informacji na temat API do baz danych zobacz 673 `dokumentację API do baz danych`_ 674 675 Gdy już będziesz czuł się komfortowo używając wspomnianego wcześniej API, 676 przeczytaj `część 2 tego tutoriala`_ aby dodać automatyczny panel admina. 677 678 .. _dokumentację API do baz danych: ../db-api/ 679 .. _część 2 tego tutoriala: ../tutorial02/