Django Framework #2 – Creiamo la nostra prima web-application (l’importanza del modello dati)

In questa seconda lezione daremo un approccio molto pratico e faremo riferimento al nostro progetto creato nella prima lezione.
Più avanti nelle lezioni parleremo delle basi di dati in Django, della configurazione del file settings.py e di come funziona l’Object Relational Mapping (ORM).

Vediamo subito come si fa ad utilizzare il database, creare le tabelle ecc.

Per inizializzare la base dei dati accedi nella cartella \test-django\tutorial_django ed esegui:

python manage.py migrate


(migrate si usa da django 1.7 in poi)

dovremmo avere in output qualcosa del genere:

vincenzo@ARGO ~/test-django/tutorial_django
$ python manage.py migrate
Operations to perform:
  Apply all migrations: contenttypes, sessions, auth, admin
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying sessions.0001_initial... OK

Proviamo ora a creare la nostra prima applicazione.

Nella scorsa lezione abbiamo visto come creare lo scheletro di un progetto.
Un progetto è costituito da varie applicazioni, ognuna delle quali è indipendente dalle altre e può essere usata in più progetti.
Una importante raccomandazione è che Python abbia accessibilità dalla variabile d’ambiente PYTHONPATH (vedi tutorial)

Creiamo l’infrastruttura della nostra prima web-application che chiameremo mywebapp:

python manage.py startapp mywebapp

Notiamo che nella cartella tutorial_django è apparsa una nuova cartella denominata mywebapp che contiene alcuni files:

/migrations
__init__.py
admin.py
apps.py
models.py
tests.py
views.py

Ora iniziamo con il creare la struttura dei dati ed utilizziamo i modelli. Il modello è un concetto importante perchè contiene i metodi e gli attributi fondamentali per l’oggetto e permette di creare l’interfaccia che assicura la persistenza dell’oggetto nella base dei dati grazie all’ORM di Django.
Alla base dei concetti suddetti vi sarebbe la necessità di rispolverare la programmazione orientata agli oggetti ed il funzionamento dei database. Gli oggetti sono correlati al database grazie all’interfacciamento di Python, che attraverso l’uso dell’ORM di Django facilita di molto le cose.

Facciamo un esempio pratico.
Vogliamo realizzare un blog che, come di solito, gestisca i nostri articoli e relativi commenti.
Dunque consideriamo gli oggetti:

- L'articolo
- Il commento

Ogni articolo è costituito almeno da un testo e da una data di pubblicazione. Ogni commento è costituito almeno da un testo e da una data, e si riferisce al rispettivo articolo (per ogni articolo ci possono essere più commenti).

Avremo perciò:

la classe Articolo con gli attributi:
-testo
-data_pubblicazione

e la classe Commento con gli attributi:
-commento
-data_commento
-rif_articolo

Cosi’ possiamo pensare che la classe Articolo produca oggetti Articolo e la classe Commento produca oggetti Commento.
E’ facile pensare che le azioni da fare con l’articolo siano pubblicazione, cancellazione ecc. ecc.
Ebbene, ogni classe ha dei metodi che potremmo pensare come delle azioni da svolgere sugli oggetti prodotti dalla classe stessa. La classe Articolo produce l’oggetto Articolo (che nell’attributo testo contiene ad esempio queste righe del tutorial che sto scrivendo, e nell’attributo data_pubblicazione contiene la data del giorno in cui l’ho scritto), e possiede un metodo denominato pubblica che permette all’oggetto Articolo di essere pubblicato sul nostro sito.

Per ora, limitiamoci a scrivere il nostro semplice modello nel database.
Nella cartella mywebapp apriamo il file models.py e cancelliamone il contenuto. Scriviamo nel file:

from django.db import models

class Articolo(models.Model):
    testo=models.TextField()
    data_pubblicazione=models.DateTimeField('data di pubblicazione')
    def __str__(self):
        return self.testo

class Commento(models.Model):
    articolo=models.ForeignKey(Articolo)
    commento=models.CharField(max_length=256)
    data_commento=models.DateTimeField('data del commento')
    pm=models.IntegerField(default=0)
    def __str__(self):
        return self.commento + u'( de : ' + self.articolo.__unicode__() +u')'

 

Una volta salvato, andiamo in settings.py, nella cartella \test-django\tutorial_django\tutorial_django e aggiungiamo ‘mywebapp‘ nelle applicazioni installate:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mywebapp',
]

Per riflettere il cambiamento dei models nella migrazione andiamo nella cartella ~/test-django/tutorial_django e diamo:

python manage.py makemigrations

Il nostro output:

vincenzo@ARGO ~/test-django/tutorial_django
$ python manage.py makemigrations
Migrations for 'mywebapp':
  0001_initial.py:
    - Create model Articolo
    - Create model Commento

 

Ora diamo:

python manage.py migrate

Ed avremo come output:

vincenzo@ARGO ~/test-django/tutorial_django
$ python manage.py migrate
Operations to perform:
  Apply all migrations: sessions, auth, admin, mywebapp, contenttypes
Running migrations:
  Rendering model states... DONE
  Applying mywebapp.0001_initial... OK

Nel nostro database SQLite potremo notare l’aggiunta di alcune tabelle (vedi figura 1).

figura 1

Ora usiamo la shell per gestire tutto dalla riga di comando, come nell’Idle di Python:

python manage.py shell

Dopo aver premuto invio, importiamo i modelli:

from mywebapp.models import Articolo, Commento

proviamo a visualizzare il contenuto degli oggetti (articoli e commenti):

Articolo.objects.all()

premendo invio, come già sapevamo, notiamo che non vi sono articoli.
Proviamo con:

Commento.objects.all()

Ed anche qui verifichiamo che non ci sono commenti.

Avremo questo output:

vincenzo@ARGO ~/test-django/tutorial_django
$ python manage.py shell
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from mywebapp.models import Articolo, Commento
>>> Articolo.objects.all()
[]
>>> Commento.objects.all()
[]
>>>

 

Proviamo a creare un articolo. Dalla shell diamo:

from django.utils import timezone

premiamo invio e diamo ancora:

mioarticolo=Articolo(testo='Ciao a tutti', data_pubblicazione=timezone.now())

Come possiamo vedere mioarticolo è il nome del nostro oggetto di classe Articolo, che noi inizializziamo impostandone gli attributi testo e data_pubblicazione.
Premiamo invio e diamo:

mioarticolo.save()

Avremo il seguente output:

>>> from django.utils import timezone
>>> mioarticolo=Articolo(testo='Ciao a tutti', data_pubblicazione=timezone.now())
>>> mioarticolo.save()
>>>

Abbiamo cosi’ creato il nostro primo articolo del blog, e dalla shell possiamo visualizzare tutte le informazioni che ci servono:

>>> mioarticolo.testo
'Ciao a tutti'
>>> mioarticolo.data_pubblicazione
datetime.datetime(2017, 7, 10, 10, 5, 24, 906771, tzinfo=)
>>> mioarticolo.id
1
>>> Articolo.objects.all()
[]
>>>

Dalla shell possiamo naturalmente anche modificare i dati e compiere tutte le altre operazioni sui modelli e non solo.

Alla prossima!

Vincenzo Quaranta

Author: vic2