Filmová databáze.
hollymovies
- složka projektu (obsahuje informace o celém projektu)__init.py__
- je zde jen proto, aby daná složka byla packageasgi.py
- nebudeme používatsettings.py
- nastavení celého projektuurls.py
- zde jsou definované url cestywsgi.py
- nebudeme používat
python manage.py runserver
Případně můžeme zadat i číslo portu:
python manage.py runserver 8001
python manage.py startapp viewer
Warning
Nesmíme zapomenout zaregistrovat aplikaci do souboru settings.py
:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'viewer',
]
viewer
- složka aplikacemigrations
- složka obsahující migrační skripty__init__.py
- prázný soubor, slouží k tomu, aby složka fungovala jako packageadmin.py
- zde uvádíme modely, které se budou zobrazovat v admin sekciapps.py
- nastavení aplikacemodels.py
- definice modelů (schéma databáze)tests.py
- testyviews.py
- funcionalita
- seznam všech filmů (movies)
- informace o filmu (viewer/movie-detail)
- informace o režisérech/hercích (viewer/creator-details)
- tvůrce
- vkládání
- editace
- mazání
- film
- vkládání
- editace
- mazání
- hodnocení filmu
- filtrování filmů na základě:
- žánru, (viewer/genre-detail)
- roku,
- herce,
- země # TODO
- seřazení filmů podle ratingu, roku,...
- vyhledávání filmu/režiséra/herce...
- genre
- id
- name
- country
- id
- name
- creator
- id
- first_name
- last_name
- date_of_birth
- date_of_death
- nationality -> country
- biography
- awards (n:m -> award)
- movies_actor (n:m -> movie)
- movies_director (n:m -> movie)
- movie
- id
- title_orig
- title_cz
- year
- length (min)
- novel_id -> novel
- productions (n:m -> production_company)
- directors (n:m -> creator)
- actors (n:m -> creator)
- countries (n:m -> country)
- genres (n:m -> genre)
- rating
- medias (n:m -> media)
- awards (n:m -> award)
- description
- reviews -> review
- review
- id
- movie_id -> movie
- reviewer -> user
- rating
- comment
- time
- award
- id
- name (-> award_name)
- category (-> category_name)
- year
- production_company
- id
- name
- foundation_year
- country_id
- novel
- id
- title
- author -> creator
- user
- id
- username
- first_name
- last_name
- media
- id
- type (image/video/text/sound)
- url
- movie_id -> movie
- actors (n:m -> creators)
- description
- image
- id
- image
- movie_id -> movie
- actors (n:m -> creators)
- description
Při každé změně v modelech musíme provést migraci databáze:
- vytvoření migračního skriptu:
python manage.py makemigration
- spuštění migrace:
python manage.py migrate
[!INFO] Migrační skripty by měli být součástí repozitáře.
Warning
Databázový soubor není součástí repozitáře, což znamená, že může dojít k situaci, kdy v nějaké branch či commit nebude zdrojový kód odpovídat aktuálnímu schématu v databázi
Nainstalujeme rozšíření:
pip install django-dump-load-utf8
Přidáme 'django_dump_load_utf8'
do INSTALLED_APPS
v souboru settings.py
.
Export (DUMP):
python manage.py dumpdatautf8 viewer --output ./files/fixtures.json
Import (LOAD):
python manage.py loaddatautf8 ./files/fixtures.json
Vrací kolekci všech nalezených záznamů z dané tabulky:
Movie.objects.all()
Vrací jeden nalezený záznam pro dané podmínky:
Movie.objects.get(id=3)
Vrací kolekci záznamů, které splňují podmínky:
Movie.objects.filter(id=3)
Movie.objects.filter(year=1994)
Movie.objects.filter(title_orig="The Green Mile")
drama = Genre.objects.get(name="Drama")
Movie.objects.filter(genres=drama)
Movie.objects.filter(genres=Genre.objects.get(name="Krimi"))
Movie.objects.filter(genres__name="Drama")
Creator.objects.filter(date_of_birth__year=1955)
Movie.objects.filter(year=1995)
Movie.objects.filter(year__gt=1995)
-- gt
=> "větší než" (greater then)
Movie.objects.filter(year__gte=1995)
-- gte
=> "větší nebo rovno" (greater then equal)
Movie.objects.filter(year__lt=1995)
-- lt
=> "menší než" (less then)
Movie.objects.filter(year__lte=1995)
-- lte
=> "menší nebo rovno" (less then equal)
Movie.objects.filter(title_orig__contains="The")
Movie.objects.filter(title_orig__in=['Se7en', 'Forrest Gump'])
Movie.objects.exclude(title_orig="Se7en")
Test, jestli hledaný záznam existuje:
Movie.objects.filter(year=1990).exists()
Spočítáme počet vyhovujících záznamů:
Movie.objects.all().count()
Movie.objects.filter(year=1994).count()
Uspořádání výsledků dotazu:
Movie.objects.all()
Movie.objects.all().order_by('year')
-- uspořádání vzestupně
Movie.objects.all().order_by('-year')
-- uspořádání sestupně
Genre.objects.create(name="Dokumentární")
genre = Genre(name="Sci-fi")
genre.save()
scifi = Genre.objects.get(name="Sci-fi")
scifi.name = "SciFi"
scifi.save()
Genre.objects.get(name="SciFi").delete()
Warning
Data se do databáze nahrají i se svým id, tedy dojde k přepisu již existujících záznamů.
V každé aplikaci máme soubor tests.py
, do kterého můžeme vkládat testy.
Můžeme vytvořit další testovací soubory, je ale vhodné, aby název začínal test*.py
.
Testování spustíme příkazem python manage.py test
- tento příkaz spustí všechny testy
ve všech souborech začínajích test
.
Příkaz python manage.py test viewer.test_models
spustí testování definované v souboru test_models
v
aplikaci viewer
.
Základní testy se spouštějí na virtuální databázi, která obsahuje stejné tabulky jako projektová databáze, ale je prázdná.
Pro testování GUI si nainstalujeme selenium (pro práci s webovou stránkou):
pip install selenium
.
Během testování musí být spuštěn server.
Warning
Zde již pracujeme s reálnou aplikací a tedy i s reálnými daty v databázi.
Nainstalujeme Pillow knihovnu pip install Pillow
V modelech můžeme využít ImageField
: image = ImageField(upload_to='images/', defaulf=None, null=False, blank=False')
Provedeme migraci.
V settings.py
přidáme cesty:
MEDIA_ROOT = BASE_DIR
MEDIA_URL = 'images/'
Do urls.py
přidáme za konec seznamu urlpatterns:
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Aby fungovalo odesílání souboru přes formulář, musí obsahovat:
<form method="post" enctype="multipart/form-data">
- jeden člen týmu vytvoří projekt
- nainstaluje Django:
pip install django
- vytvoří soubor requirements.txt
pip freeze > requirements.txt
- vytvoří Django projekt
django-admin startproject <nazev_projektu> .
- nainstaluje dotenv:
pip install python-dotenv
- vytvoří soubor
.env
, který bude obsahovat citlivé informace - vytvoří git repozitář
- vytvoří .gitignore soubor
- do .gitignore vloží:
/.idea/* /db.sqlite3 /.env
- odešle ho na GitHub
- nasdílí ostatním členům v týmu adresu repozitáře
- nastaví spolupracovníky (Settings -> Collaborators -> Add people)
- ostatní členové
- naklonují si projekt
- vytvoří virtuální prostředí (.venv)
- nainstalují potřebné balíčky ze souboru requirements.txt
- vytvoří
.env
soubor obsahující SECURITY_KEY
pip install -r requirements.txt
- vytvořit readme.md soubor
- popis projektu
- může být anglicky (preferováno) nebo česky
- může obsahovat ER diagram
- může obsahovat screenshoty