English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Introduction rapide à Django-Tutoriel détaillé sur le modèle de base de données
La première partie de cette série de tutoriels est déjà terminée. Sur la base du dernier tutoriel, dans cette leçon, nous allons créer une base de données, créer le premier modèle et utiliser un site administratif généré automatiquement par Django.
Maintenant, ouvrez mysite/settings.py. Le module de configuration Django de Django définit les variables de niveau module de la même manière que les modules Python normaux.
Par défaut, la configuration utilise SQLite. Si vous êtes débutant en base de données ou si vous souhaitez essayer d'apprendre Django, c'est la meilleure option. SQLite est inclus dans Python, donc vous n'avez pas besoin d'installer quoi que ce soit pour prendre en charge votre base de données. Lorsque vous commencez votre premier projet réel, vous pourriez peut-être utiliser une base de données plus puissante comme PostgreSQL, MySQL, etc., et vous pouvez configurer le basculement de base de données.
Si vous souhaitez utiliser une autre base de données, installez les liaisons de base de données appropriées et modifiez les éléments de configuration par défaut de la base de données pour correspondre à vos paramètres de connexion de base de données :
ENGINE – Entrer 'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql', ou 'django.db.backends.oracle' NAME – Nom de la base de données. Si vous utilisez SQLite, la base de données créera un fichier sur votre ordinateur ; dans ce cas, le nom doit être le chemin absolu complet du fichier, y compris le nom de fichier. La valeur par défaut est os.path.join(BASE_DIR, 'db.sqlite',3) sera stocké dans le répertoire de votre projet.
Si vous n'utilisez pas SQLite comme base de données et que vous utilisez d'autres paramètres tels que USER, PASSWORD et HOST, vous devez les ajouter. Pour plus de détails, veuillez consulter Documentation de référence de la base de données.
Lorsque vous éditez mysite/settings.py, la configuration de fuseau horaire TIME_ZONE.
En outre, veuillez noter la configuration INSTALLED_APPS en haut du fichier. Elle contient le nom de nombreux applications Django activés dans cet exemple Django. Les applications peuvent être utilisées dans plusieurs projets, vous pouvez les empaqueter et les distribuer à d'autres utilisateurs dans leurs projets.
Par défaut, INSTALLED_APPS contient les applications suivantes, toutes utilisant Django :
django.contrib.admin – Administration du site, on l'utilisera rapidement django.contrib.auth – Système d'authentification django.contrib.contenttypes – Une framework, type de contenu django.contrib.sessions – Un cadre pour les sessions django.contrib.messages – Un cadre pour la transmission de messages django.contrib.staticfiles – Un cadre pour gérer les fichiers statiques
Ces applications incluent par défaut, comme un exemple pratique commun.
Certains de ces applications utilisent au moins une table de base de données, donc nous devons créer les tables dans la base de données avant de pouvoir les utiliser. Pour cela, exécutez la commande suivante :
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 C:\Python27\mysite>python manage.py migrate Opérations à effectuer: Appliquer toutes les migrations: admin, contenttypes, auth, sessions Exécution des migrations: Rendu des états du modèle... TERMINÉ Application de contenttypes.0001_initial... OK Application de auth.0001_initial... OK Application de admin.0001_initial... OK Application de admin.0002_logentry_remove_auto_add... OK Application de contenttypes.0002_remove_content_type_name... OK Application de auth.0002_alter_permission_name_max_length... OK Application de auth.0003_alter_user_email_max_length... OK Application de auth.0004_alter_user_username_opts... OK Application de auth.0005_alter_user_last_login_null... OK Application de auth.0006_require_contenttypes_0002... OK Application de auth.0007_alter_validators_add_error_messages... OK Application de sessions.0001_initial... OK C:\Python27\mysite>
La commande migrate se concentre sur la configuration INSTALLED_APPS et crée en fonction de votre mysite/Le fichier settings.py contient les paramètres de la base de données et migre toutes les tables de bases de données de l'application (nous en discuterons dans des tutoriels futurs). Vous verrez chaque message applicable à la transplantation. Si vous êtes intéressé, exécutez la commande en ligne dans votre client de base de données, par exemple type \dt (PostgreSQL), SHOW TABLES; (MySQL), .schema (SQLite), ou SELECT TABLE_NAME FROM USER_TABLES; (Oracle) pour afficher les tables créées par Django.
Maintenant, nous allons définir le modèle - En essence, la base de données est conçue en utilisant d'autres métadonnées.
Dans notre application d'enquête simple, nous créerons deux modèles : Question et Choice. Question a un titre de question et une date de publication. Choice a deux champs : le texte de choix et le nombre de votes. Chaque option est associée à une question.
Ces concepts sont représentés par des classes Python simples. Éditer polls/models.py, donc polls/models.py semble être ainsi :
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 import datetime from django.utils import timezone 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)
Ce code est direct. Chaque modèle est une sous-classe de la classe django.db.models.Model. Chaque modèle possède de nombreux variables de classe, chacune associée à un champ de la table de la base de données.
Chaque champ est représenté par une instance de la classe Field – par exemple, CharField représente un champ de caractères, DateTimeField représente un champ de date et heure. Cela indique à Django le type de données stocké pour chaque champ.
Le nom de chaque instance de Field (par exemple, question_text ou pub_date) est le nom du champ, ce qui est un format convivial pour les machines. En utilisant cette valeur dans le code Python, la base de données l'utilisera comme nom de colonne.
Les champs peuvent également avoir des paramètres optionnels différents ; dans cet exemple, nous avons déjà défini le vote par défaut sur 0.
Enfin, il convient de noter la définition des relations, ici utilisant les clés étrangères. Cela indique à Django que chaque option est associée à une question. Django prend en charge toutes les relations de bases de données courantes : un à un, plusieurs à un, plusieurs à plusieurs et un à un.
Le code du modèle est petit, mais il représente beaucoup d'informations sur Django. Avec lui, Django peut :
为这个应用程序创建数据库(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 : fr.oldtoolbag.com # Date : 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 : fr.oldtoolbag.com # Date : 2020-08-08 C:\Python27mysite>python manage.py makemigrations polls Migrations for 'polls': 0001_initial.py: - Créer le modèle Choice - Créer le modèle Question - Ajouter le champ question au choix 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 : fr.oldtoolbag.com # Date : 2020-08-08 $ python manage.py sqlmigrate polls 0001
你应该看到类似下面的内容(我们已经重新格式化它的可读性):
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 C:\Python27mysite>python manage.py sqlmigrate polls 0001 BEGIN; -- -- Créer le modèle Choice -- CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c hoice_text" varchar(200) NOT NULL, "votes" integer NOT NULL); -- -- Créer le modèle Question -- CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL); -- -- Ajouter le champ question au choix -- ALTER TABLE "polls_choice" RENAME TO "polls_choice__old"; CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c hoice_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>
La commande de migration exécutera toutes les migrations non encore appliquées (Django suit celles qui sont appliquées dans une table spéciale du nom django_migrations dans la base de données) et les exécutera dans la base de données. - En règle générale, il utilisera les modèles pour synchroniser les changements du schéma de base de données.
Maintenant, entrons dans le shell interactif Python et l'API fournie par Django. Pour appeler la ligne de commande Python, utilisez la commande suivante :
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 C:\Python27C:\Python\mysite>python manage.py shell Python 2.7.10 (默認,五月 23 2015, 09:44) [MSC v.1500 64 bit (AMD64)] 在 wi n32 輸入“help”、“copyright”、“credits”或“license”以獲取更多信息。 (互動控制台) >>>
只需輸入“python”來代替,因為manage.py設置DJANGO_SETTINGS_MODULE環境變量,這給Django Python導入路徑到mysite/settings.py文件。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 >>> import django >>> django.setup()
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 >>> from polls.models import Question, Choice # 引入我們剛剛編寫的模型類。 # 系統中還沒有問題。 >>> Question.objects.all() [] # 創建一個新的Question。 # 默認設置文件中已啟用時區支持,所以 # Django期望pub_date是一個帶有tzinfo的datetime。使用timezone.now() # 代之於datetime.datetime.now()並將完成正確的操作。 >>> from django.utils import timezone >>> q = Question(question_text="什麼新聞?", pub_date=timezone.now()) # 將對象保存到數據庫中。您必須明確調用save()。 >>> q.save() # 現在它有一個ID。注意這可能會說1L"代之於1"依賴 # on which database you're using. That's no biggie; it just means your # database backend prefers to return integers as Python long integer # objects. >>> q.id 1 # Access model field values via Python attributes. >>> q.question_text "What's new?" >>> q.pub_date datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>) # Change values by changing the attributes, then calling save(). >>> q.question_text = "What's up?" >>> q.save() # objects.all() affiche toutes les questions dans la base de données. >>> Question.objects.all() [<Question: Question object>]
Il faut attendre un moment. <Question: Question object> est une représentation inutile de cet objet. Laissons-nous résoudre ce problème : en éditant le modèle Question (dans polls/Ajoutez une méthode __str__() à ces deux modèles Question et Choice (dans le fichier models.py) :
polls/Le contenu du fichier models.py est le suivant :# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 import datetime from django.utils.encoding import python_2_unicode_compatible @python_2_unicode_compatible # only if you need to support Python 2 from django.utils import timezone 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): class Question(models.Model): def __str__(self): return self.choice_text
Il est très important d'ajouter la méthode __str__(), qui utilise des提示交互式处理将其添加到模型中,这不仅方便自己,也是因为对象的表示用于整个 Django 自动生成管理。
注意,这些都是正常的Python方法。让我们添加一个自定义的方法,这里只是为了演示:polls/Attention, ce sont des méthodes Python normales. Ajoutons une méthode personnalisée, ici juste pour illustrer : polls
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 models.py 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()1)
Attention, ici nous ajoutons import datetime et from django.utils import timezone pour utiliser le module standard datetime de Python et les utilitaires de fuseau horaire de Django dans django.utils.timezone. Si vous n'êtes pas familier avec la gestion des fuseaux horaires en Python, vous pouvez lire Documentation de la prise en charge des fuseaux horaires.
Enregistrer ces modifications et redémarrer python manage.py shell pour démarrer un nouveau shell Python :
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 >>> from polls.models import Question, Choice # Assurez-vous que notre ajout __str__() fonctionne. >>> Question.objects.all() [<Question: Qu'est-ce qui se passe?>] # Django fournit une API de recherche de base de données riche qui est entièrement alimentée par # arguments de mot-clé. >>> Question.objects.filter(id=1) [<Question: Qu'est-ce qui se passe?>] >>> Question.objects.filter(question_text__startswith='What') [<Question: Qu'est-ce qui se passe?>] # Obtenir la question publiée cette année. >>> from django.utils import timezone >>> current_year = timezone.now().year >>> Question.objects.get(pub_date__year=current_year) <Question: Quoi de neuf?> # Demander un ID qui n'existe pas, cela provoquera une exception. >>> Question.objects.get(id=2) Traceback (appel le plus récent en dernier): ... DoesNotExist: Question correspondant à la requête n'existe pas. # La recherche par clé primaire est le cas le plus courant, donc Django fournit un # raccourci pour primaire-recherches exactes par clé. # Ce qui suit est identique à Question.objects.get(id=1) >>> Question.objects.get(pk=1) <Question: Quoi de neuf?> # S'assurer que notre méthode personnalisée a fonctionné. >>> q = Question.objects.get(pk=1) >>> q.was_published_recently() True # Donner à la Question quelques Choix. L'appel create construit un nouveau # L'objet Choice, effectue l'instruction INSERT, ajoute le choix à l'ensemble # du nombre de choix disponibles et renvoie le nouveau objet Choice. Django crée # Un ensemble pour contenir le "côté autre" d'une relation ForeignKey # (par exemple, un choix de question) qui peut être accédé via l'API. >>> q = Question.objects.get(pk=1) # Afficher toute les choix de l'ensemble lié -- Rien pour le moment. >>> q.choice_set.all() [] # Créer trois choix. >>> q.choice_set.create(choice_text='pas beaucoup', votes=0) <Choice: pas beaucoup> >>> q.choice_set.create(choice_text='Ciel', votes=0) <Choice: Ciel> >>> c = q.choice_set.create(choice_text='Encore en hacking', votes=0) # Les objets Choice ont accès à leurs objets Question associés via l'API. >>> c.question <Question: Quoi de neuf?> # et vice versa: les objets Question ont accès aux objets Choice. >>> q.choice_set.all() [<Choice: pas beaucoup>, <Choice: Ciel>, <Choice: Encore en hacking>] >>> q.choice_set.count() 3 # L'API suit automatiquement les relations aussi loin que nécessaire. # Utilisez des doubles tirets bas pour séparer les relations. # Cela fonctionne aussi profondément que vous le souhaitez; il n'y a pas de limite. # Trouver toutes les Choices pour toute question dont la date de publication est cette année # (réutilisant la variable 'current_year' que nous avons créée précédemment). >>> Choice.objects.filter(question__pub_date__year=current_year) [<Choice: pas beaucoup>, <Choice: Ciel>, <Choice: Encore en hacking>] # Effacer l'une des options. Utilisez delete() pour cela. >>> c = q.choice_set.filter(choice_text__startswith='Just hacking') >>> c.delete()
首先,我们需要创建可以登录到管理界面的用户。运行以下命令:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08c:\python27\mysite> python manage.py createsuperuser
输入你想要的用户名(随便一个),然后按Enter。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 Username: admin
然后,将提示输入电子邮件地址(随便一个):
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 Email address: [email protected]
最后一步是要输入密码。它会要求输入密码两次,第二次为第一的确认。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 Password: ********** Password (again): ********* Superuser created successfully.
Django管理站点默认激活。让我们启动开发服务器,并探索它。
如果服务器未运行,启动它,如下所示:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 c:\python27\mysite>python manage.py runserver
现在,打开Web浏览器,进入“/admin/”本地域名- 例如, http://127.0.0.1:8000/admin/ 应该看到管理员登录界面:
由于默认情况下启用,登录屏幕可能会显示在你自己的语言,由于默认情况下启用,登录屏幕可能会显示在你自己的语言,
现在,尝试与在上一步中创建的超级用户帐号登录。应该会看到 Django 管理的首页:
你应该看到一些可编辑内容:组和用户。它们由django.contrib.auth,Django的认证框架提供。
poll应用程序在哪里?它不会显示在管理索引页面上。
只有一件事要做:我们需要告诉管理员这个Question对象有一个管理界面。要做到这一点,打开 polls/admin.py文件,并修改它如下:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : fr.oldtoolbag.com # Date : 2020-08-08 from django.contrib import admin from models import Question admin.site.register(Question)
Cliquez sur "Questions".
Cliquez sur cette question "Quoi de neuf ?" pour l'édition :
Les points à noter sont répertoriés ici :
Le formulaire est généré automatiquement à partir du modèle Question.
Différents types de champs (DateTimeField, CharField) correspondent aux composants d'entrée HTML correspondants. Chaque type de champ sait comment il est affiché dans Django.
Chaque champ DateTimeField reçoit un raccourci JavaScript. La date reçoit un raccourci "Aujourd'hui" et un calendrier s'affiche, et plusieurs raccourcis "Maintenant" s'affichent et un panneau s'affiche, listant les heures d'entrée courantes.Modifier "Date publiée", cliquer sur "Aujourd'hui" et les raccourcis clavier "Maintenant". Ensuite, cliquer sur "Enregistrer et continuer à éditer". Ensuite, cliquer sur "Historique" dans le coin supérieur droit. Vous verrez une page qui liste toutes les modifications apportées à cet objet via Django, le nom d'utilisateur et le timestamp de l'utilisateur : Téléchargement du code : http://pan.baidu.com/s/1jGR3wDg