English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial di avvio rapido di Django - Modello di database

Tutorial di avvio rapido di Django - Operazioni dettagliate del modello di database

La prima parte di questa serie di tutorial è stata completata. Sulla base del tutorial precedente, in questo tutorial costruiremo il database, creeremo il primo modello e utilizzeremo un sito di gestione automaticamente generato da Django.

Configurazione del database

Ora, apri mysite/settings.py. Il modulo di configurazione di Django gestisce variabili a livello di modulo allo stesso modo di un modulo Python normale.

Per impostazione predefinita, la configurazione utilizza SQLite. Se sei un principiante del database o desideri provare a imparare Django, questa è la scelta più semplice. SQLite è inclusa in Python, quindi non è necessario installare nulla per supportare il tuo database. Quando inizi il tuo primo progetto vero, potresti dover utilizzare database più potenti come PostgreSQL, MySQL, ecc., e puoi configurare il passaggio del database.

Se desideri utilizzare un altro database, installa il relativo binding del database e modifica le seguenti chiavi nella configurazione predefinita del database per adattarle alle tue impostazioni di connessione al database:

ENGINE – Inserisci 'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql' o 'django.db.backends.oracle' NAME – The name of the database. If using SQLite, the database will create a file on your computer; in this case, the name should be the full absolute path to the file, including the filename. The default value is os.path.join(BASE_DIR, 'db.sqlite3'), which will be stored in the file in your project directory.

If you do not use SQLite as the database and use other settings such as USER, PASSWORD, and HOST, they must be added. For more detailed information, please refer to Database reference documentation

When editing mysite/settings.py, the timezone setting TIME_ZONE.

In addition, please note the INSTALLED_APPS setting at the top of this file. It contains the names of many Django applications that are activated in this Django example. Applications can be used in multiple projects, and you can package them and distribute them for use in other projects.

By default, INSTALLED_APPS includes the following applications that use Django:

django.contrib.admin – Site management, which will be used soon django.contrib.auth – Authentication system django.contrib.contenttypes – A framework, content types django.contrib.sessions – A session framework django.contrib.messages – A messaging framework django.contrib.staticfiles – A framework for managing static files

These applications include the default, as a convenient common example.

Some of these applications use at least one database table, so we need to create the tables in the database before we can use them. To do this, run the following command:

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
C:\Python27\mysite>python manage.py migrate
 Operations to perform:
   Apply all migrations: admin, contenttypes, auth, sessions
 Running migrations:
   Rendering model states... DONE
   Applying contenttypes.0001_initial... OK
   Applicando auth.0001_initial... OK
   Applicando admin.0001_initial... OK
   Applicando admin.0002_logentry_remove_auto_add... OK
   Applicando contenttypes.0002_remove_content_type_name... OK
   Applicando auth.0002_alter_permission_name_max_length... OK
   Applicando auth.0003_alter_user_email_max_length... OK
   Applicando auth.0004_alter_user_username_opts... OK
   Applicando auth.0005_alter_user_last_login_null... OK
   Applicando auth.0006_require_contenttypes_0002... OK
   Applicando auth.0007_alter_validators_add_error_messages... OK
   Applicando sessions.0001_initial... OK
 C:\Python27\mysite>

Il comando migrate si concentra sull'impostazione INSTALLED_APPS e crea in base alle impostazioni del database nel file mysite/settings.py, e migra qualsiasi tabella di database dell'applicazione (ne discuteremo in un tutorial successivo). Vedrai un messaggio per ogni transplantation applicabile. Se interessato, esegui il comando sulla riga di comando del tuo client di database, ad esempio tipo \dt (PostgreSQL), SHOW TABLES; (MySQL), .schema (SQLite), o SELECT TABLE_NAME FROM USER_TABLES; (Oracle) per visualizzare le tabelle create da Django.

Creare il modello

Ora, definiremo il modello - sostanzialmente progettiamo il database utilizzando altri metadati.

Nel nostro'applicazione di sondaggi semplice, creeremo due modelli: Question e Choice. Question ha un titolo della domanda e una data di pubblicazione. Choice ha due campi: il testo della scelta e il numero di voti. Ogni opzione è associata a una domanda.

Questi concetti vengono rappresentati da semplici classi Python. Modifica il file polls/models.py, quindi  polls/models.py 看起来是这样的:


 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
from django.db import models
 class Question(models.Model):
     question_text = models.CharField(max_length=200)
     pub_date = models.DateTimeField('date published')
 class Choice(models.Model):
     question = models.ForeignKey(Question, on_delete=models.CASCADE)
     choice_text = models.CharField(max_length=200)
     votes = models.IntegerField(default=0)

该代码是直接的。每个模型是django.db.models.Model类的子类。 每个模型具有许多类变量,每一个在模型变量与数据库表的字段关联。

每个字段由 Field 类实例表示 – 例如,CharField表示字符型字段,DateTimeField表示日期时间字段。这告诉Django 每个字段保存的数据类型。

每个Field实例(例如,question_text或pub_date)的名称是字段的名称,这是机器友好的格式。在Python代码中使用这个值,数据库将使用它作为列名。

字段也可以有不同的可选参数;在本示例中,我们已经将票数的默认值设置为0。

最后,需要注意的是关系的定义,这里使用了外键。这告诉 Django 每个选项关联一个问题。 Django支持所有常见的数据库关系:多对一,多对多以及一对之一。

激活模型

模型代码很小,但表示了 Django 的很多信息。有了它 Django 可以:

为这个应用程序创建数据库(CREATE TABLE语句)

创建访问 Question 和 Choice对象的Python数据库访问API

但首先我们需要告诉 polls 项安装了的应用程序。

再次编辑 mysite/settings.py 文件,并更改INSTALLED_APPS设置包含字符串“polls.apps.PollsConfig”。结果如下所示:

mysite/settings.py文件内容如下:

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes'
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
现在Django知道 polls 投票程序。让我们运行另一个命令:
# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
C:\Python27\mysite>python manage.py makemigrations polls
 Migrations for 'polls':
   0001_initial.py:
     - Create model Choice
     - Create model Question
     - Add field question to choice
 C:\Python27\mysite>

通过运行makemigrations,告诉Django你已经做了模型一些改动(在这种情况下,已经是最新的了),并且你想更改存储作为一个移植。

迁移是Django如何存储您更改的模型(由你的数据库架构决定)- 它们只是在磁盘上的文件。如果您喜欢可以读取移植新的模型,它在文件 polls/migrations/0001_initial.py。你不会希望Django每次都读取它们,不过将它们设计成人可编辑的,你要知道Django是如何变化的并手动调整。

还有将运行migrations,自动管理数据库模式(表)命令 - 这就是所谓的迁移,让我们看看SQL了解移植运行。 sqlmigrate 命令将移植名称返回SQL显示:


 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
$ python manage.py sqlmigrate polls 0001

应该看到类似下面的东西(我们已经重新格式化它的可读性):

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
C:\Python27\mysite>python manage.py sqlmigrate polls 0001
 BEGIN;
 --
 -- Create model Choice
 --
 CREATE TABLE "polls_choice" ("id" integer not NULL PRIMARY KEY AUTOINCREMENT, "c
 choice_text" varchar(200) not NULL, "votes" integer not NULL);
 --
 -- Create model Question
 --
 CREATE TABLE "polls_question" ("id" integer not NULL PRIMARY KEY AUTOINCREMENT,
 "question_text" varchar(200) not NULL, "pub_date" datetime not NULL)
 --
 -- Aggiungi campo question alla scelta
 --
 ALTER TABLE "polls_choice" RENAME TO "polls_choice__old";
 CREATE TABLE "polls_choice" ("id" integer not NULL PRIMARY KEY AUTOINCREMENT, "c
 "choice_text" varchar(200) not NULL, "votes" integer not NULL, "question_id" integer
 er not NULL REFERENCES "polls_question" ("id"));
 INSERT INTO "polls_choice" ("choice_text", "votes", "id", "question_id") SELECT
 "choice_text", "votes", "id", NULL FROM "polls_choice__old";
 DROP TABLE "polls_choice__old";
 CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");
 COMMIT;
 C:\Python27\mysite>

Il comando di migrazione esegue tutti i迁移 che non sono stati applicati (Django traccia quali sono utilizzando un tavolo speciale chiamato django_migrations nel database) e li esegue nel database - in pratica, sincronizza le modifiche dello schema del database utilizzando i modelli.

Usare l'API

Ora, entriamo nel shell interattivo di Python e nell'API fornita da Django. Per chiamare il comando della riga di comando di Python, utilizzare il seguente comando:

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
C:\Python27\mysite>python manage.py shell
 Python 2.7.10 (predefinito, 23 maggio 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] su wi
 n32
 Digita "help", "copyright", "credits" o "license" per ulteriori informazioni.
 (Console Interattiva)
 >>>

Basta digitare "python" al posto di, perché manage.py imposta l'ambiente DJANGO_SETTINGS_MODULE, che dà a Django il percorso di importazione per il file mysite/settings.py.

# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
>>> import django
 >>> django.setup()
# Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
>>> from polls.models import Question, Choice # importa le classi del modello che abbiamo appena scritto.
 # Non ci sono ancora domande nel sistema.
 >>> Question.objects.all()
 []
 # Crea una nuova Question.
 # La supporto dei fusi orari è abilitato nel file di impostazioni predefinito, quindi
 # Django si aspetta un datetime con tzinfo per pub_date. Usa timezone.now()
 # al posto di datetime.datetime.now() e farà la cosa giusta.
 >>> from django.utils import timezone
 >>> q = Question(question_text="Cosa c'è di nuovo?", pub_date=timezone.now())
 # Salva l'oggetto nel database. Devi chiamare save() esplicitamente.
 >>> q.save()
 # Ora ha un ID. Nota che potrebbe dire "1L" invece di "1", a seconda
 # su quale database stai utilizzando. Questo non è un problema grande; significa semplicemente che
 # Il backend del database preferisce restituire gli interi come interi lunghi Python
 # objects.
 >>> q.id
 1
 # Accedi ai valori del campo del modello tramite attributi Python.
 >>> q.question_text
 "What's new?"
 >>> q.pub_date
 datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
 # Modifica i valori modificando gli attributi, quindi chiamando save().
 >>> q.question_text = "What's up?"
 >>> q.save()
 # objects.all() visualizza tutte le domande nel database.
 >>> Question.objects.all()
 [<Question: Question object>]

Occorre aspettare un po'. <Question: Question object> è semplicemente una rappresentazione inutile di questo oggetto. Vediamo di risolvere questo problema: editando il modello Question (nel file polls/models.py) e aggiungendo un metodo __str__() a questi modelli Question e Choice:

Il contenuto del file polls/models.py è il seguente:
 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
from django.db import models
 from django.utils.encoding import python_2_unicode_compatible
 @python_2_unicode_compatible # only if you need to support Python 2
 class Question(models.Model):
     # ...
     def __str__(self):
         return self.question_text
 @python_2_unicode_compatible # only if you need to support Python 2
 class Choice(models.Model):
     # ...
     def __str__(self):
         return self.choice_text

Aggiungere il metodo __str__() è molto importante, utilizzare l'interazione di prompt per aggiungere al modello, non solo per facilitare sé stessi, ma anche perché la rappresentazione dell'oggetto viene utilizzata per l'intera generazione automatica di gestione di Django.

Attenzione, tutti questi sono metodi normali di Python. Aggiungiamo un metodo personalizzato, qui semplicemente per dimostrazione: polls/models.py

 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
import datetime
 from django.db import models
 from django.utils import timezone
 class Question(models.Model):
     # ...
     def was_published_recently(self):
         return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

Attenzione, qui è stato aggiunto import datetime e from django.utils import timezone, che richiamano il modulo standard datetime di Python e gli strumenti di fuso orario di Django in django.utils.timezone. Se non sei familiare con la gestione dei fusi orari in Python, puoi leggere  Documentazione di supporto per il fuso orario

Salva queste modifiche e esegui di nuovo python manage.py shell per avviare una nuova shell di interazione Python:

 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
>>> from polls.models import Question, Choice
 # Assicurarsi che l'aggiunta di __str__() funzioni.
 >>> Question.objects.all()
 [<Question: Cosa succede?>]
 # Django fornisce un ricco API di ricerca del database interamente alimentato da
 # Argomenti di ricerca.
 >>> Question.objects.filter(id=1)
 [<Question: Cosa succede?>]
 >>> Question.objects.filter(question_text__startswith='What')
 [<Question: Cosa succede?>]
 # Ottenere la domanda pubblicata quest'anno.
 >>> from django.utils import timezone
 >>> current_year = timezone.now().year
 >>> Question.objects.get(pub_date__year=current_year)
 <Question: Cosa succede?>
 # Richiesta di un ID che non esiste, questo genererà un'eccezione.
 >>> Question.objects.get(id=2)
 Traceback (most recent call last):
     ...
 DoesNotExist: Question matching query does not exist.
 # Lookup by a primary key is the most common case, so Django provides a
 # shortcut for primary-key exact lookups.
 # The following is identical to Question.objects.get(id=1).
 >>> Question.objects.get(pk=1)
 <Question: Cosa succede?>
 # Make sure our custom method worked.
 >>> q = Question.objects.get(pk=1)
 >>> q.was_published_recently()
 True
 # Give the Question a couple of Choices. The create call constructs a new
 # Choice object, does the INSERT statement, adds the choice to the set
 # of available choices and returns the new Choice object. Django creates
 # A set to hold the "other side" of a ForeignKey relation
 # (e.g. a question's choice) which can be accessed via the API.
 >>> q = Question.objects.get(pk=1)
 # Display any choices from the related object set -- None so far.
 >>> q.choice_set.all()
 []
 # Create three choices.
 >>> q.choice_set.create(choice_text='not much', votes=0)
 <Choice: non molto>
 >>> q.choice_set.create(choice_text='Il cielo', votes=0)
 <Choice: Il cielo>
 >>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
 # Gli oggetti Choice hanno accesso API ai loro oggetti Question correlati.
 >>> c.question
 <Question: Cosa succede?>
 # e viceversa: gli oggetti Question ottengono accesso agli oggetti Choice.
 >>> q.choice_set.all()
 [<Choice: non molto>, <Choice: Il cielo>, <Choice: Just hacking again>]
 >>> q.choice_set.count()
 3
 # L'API segue automaticamente le relazioni fino a dove hai bisogno.
 # Usa due underscore per separare le relazioni.
 # Funziona a qualsiasi livello di profondità desiderato; non ci sono limiti.
 # Trova tutte le Choice per qualsiasi domanda whose pub_date è in questo anno
 # (riutilizzando la variabile 'current_year' creata sopra).
 >>> Choice.objects.filter(question__pub_date__year=current_year)
 [<Choice: non molto>, <Choice: Il cielo>, <Choice: Just hacking again>]
 # Eliminiamo una delle scelte. Usa delete() per farlo.
 >>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
 >>> c.delete()

Introduzione al sito di gestione Django

Crea un utente amministratore

Prima di tutto, dobbiamo creare un utente che può accedere all'interfaccia di gestione. Esegui il seguente comando:

 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08c:\python27\mysite> python manage.py createsuperuser

Inserisci il nome utente desiderato (qualsiasi) e premi Invio.

 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
Username: admin

Poi, ti verrà richiesto di inserire un indirizzo email (qualsiasi):

 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
Indirizzo email: [email protected]

L'ultimo passo è inserire la password. Viene richiesto di inserire la password due volte, la seconda per confermare la prima.

 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
Password: **********
 Password (di nuovo): *********
 Superuser creato con successo.

Avvia il server di sviluppo

Il sito di gestione Django è attivato per impostazione predefinita. Iniziamo il server di sviluppo e esploriamolo.

Se il server non è in esecuzione, avvialo come segue:

 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
c:\python27\mysite>python manage.py runserver

Ora, apri il browser web e vai a “/admin/” nome di dominio locale ad esempio,   http://127.0.0.1:8000/admin/  Dovresti vedere l'interfaccia di login dell'amministratore:  

Poiché la visualizzazione delle lingue predefinite è attivata per impostazione predefinita, lo schermo di login potrebbe essere visualizzato nella tua lingua, poiché la traduzione è attivata per impostazione predefinita, lo schermo di login potrebbe essere visualizzato nella tua lingua,

Inserisci il sito web dell'amministratore

Ora, tenta di accedere con l'account utente superutente creato nel passaggio precedente. Dovresti vedere la pagina iniziale di gestione Django:  

Dovresti vedere alcuni contenuti modificabili: gruppi e utenti. Forniti da django.contrib.auth, il framework di autenticazione di Django.

Modifica il programma di gestione poll

Dove si trova l'applicazione poll? Non viene visualizzata nella pagina dell'indice di gestione.

C'è solo una cosa da fare: dobbiamo comunicare all'amministratore che l'oggetto Question ha un'interfaccia di gestione. Per farlo, apri il file polls/admin.py e modificalo come segue:  

 # Filename: example.py
# Copyright: 2020 By w3codebox
# Author by: it.oldtoolbag.com
# Data: 2020-08-08
from django.contrib import admin
 from models import Question
 admin.site.register(Question)

Esplora le funzionalità di gestione

Ora, abbiamo registrato Question, Django sa che dovrebbe essere visualizzato nella pagina principale di gestione:

Clicca su “Questions”. Ora, nella pagina “change list” guarda le domande. Questa pagina mostra tutte le domande nel database e ti permette di selezionarne una per modificarla. Ecco anche la domanda che abbiamo creato in precedenza:

Clicca su “Cosa c'è di nuovo?” questa domanda per editare:

Ecco elencate le cose da notare:

 

Il modulo è generato automaticamente dal modello (Question).

 

I tipi di campo diversi (DateTimeField, CharField) corrispondono ai componenti di input HTML corrispondenti. Ogni tipo di campo sa come si presenta nel Django Management.

Ogni campo DateTimeField riceve un collegamento rapido JavaScript. La data riceve un collegamento rapido “Oggi” che apre un calendario e riceve più volte il collegamento rapido “Ora” che apre una finestra elencando le ore di input comuni.

Modifica “Data pubblicata” cliccando sui pulsanti rapidi “Oggi” e “Ora”. Poi clicca su “Salva e continua l'editing.”, quindi clicca su “Cronologia” nell'angolo in alto a destra. Vedrai una pagina che elenca tutte le modifiche apportate a questo oggetto tramite Django, nome utente modificatore e timestamp:   Download del codice:  http://pan.baidu.com/s/1jGR3wDg