[PYTHON] Une série d'ingénieurs d'infrastructure amateurs touchant Django avec Docker (2): création d'un modèle

TL;DR Poursuite de L'ingénieur d'infrastructure amateur touche Django avec la série Docker ①: Créer Django avec Docker. Je vais créer un modèle pour django que j'ai fait la dernière fois. Il existe un site appelé Django Girls qui a un tutoriel django, donc cette fois je vais échantillonner le blog selon les chapitres après "Django model" de celui-ci. Jouez avec django en essayant de le créer. (Ce site est très facile à comprendre, et honnêtement, cela peut être mieux que de regarder ce post, mais en divulguant le processus d'apprentissage et de recherche lorsqu'un amateur l'a touché, des personnes du même niveau J'écris dans le but de promouvoir la compréhension.)

Politique de conception de Django

Model - Template - View Django semble être conçu avec l'idée de MTV (Model Template View). J'ai entendu parler de MVC (Model View Controller) (seulement le nom). .. Vérifiez un par un.

Model Le modèle interagit avec la base de données. Dans l'exemple de blog DjangoGirls, après avoir mentionné l'orientation des objets, les éléments suivants sont répertoriés comme données nécessaires pour le blog.

Post
--------
title
text
author
created_date
published_date

Un tel format de données qui sera nécessaire est défini comme un modèle, et lorsqu'une demande arrive, les données nécessaires sont extraites de la base de données et renvoyées. Cela semble être à peu près le même que le rôle de Model dans MVC. (Peut-être)

Template Les modèles dans Django font référence à la bonne partie. Cela inclut html et CSS et javascript pour le compléter. Dans MVC, le rôle de View. C'est compliqué. .. Dans MVC, le contrôleur relie le modèle et la vue, et le modèle dans le MTV n'obtient pas de données directement du modèle. Assurez-vous de gérer les données via View.

View Comme je l'ai mentionné un peu dans Template, View décrit comment afficher les informations acquises à l'aide de Model. Après cela, il est transformé en fonction et lié à Template. En d'autres termes, en tant que rôle, ① Émettez une commande d'acquisition de données au modèle ② Déterminer le modèle à renvoyer à la demande de l'utilisateur ③ Passer les données acquises du modèle au modèle en tant que fonction Il ya trois. (Je ne suis pas très confiant, mais si je fais une erreur, je vais la réparer, alors veuillez le signaler.) Lorsqu'un utilisateur visite un site Web fait de django, décidez d'abord quelle fonction View traiter en fonction de la description dans urls.py, et la fonction View sélectionnée utilise Model pour acquérir des données et les utiliser comme modèle sélectionné. Affichez la page Web après avoir transmis les données.

L'image est-elle en quelque sorte la suivante?  U  ⇒ urls.py ⇒ view.py ⇔ Model ⇔ DB  S        ⇓  E        ⇓  R  ⇐    Templates

Avec une douce conscience de ces trois rôles, passez à la construction.

Construire

① Créer un modèle d'application

manage.py startapp

docker-compose run web python manage.py startapp blog

Créez un modèle d'application dans l'environnement local à l'aide du fichier docker-compose.yaml créé précédemment. La dernière fois, manage.py a été utilisé pour que le serveur d'exécution démarre le serveur Web, mais si vous utilisez l'application de démarrage, il créera les fichiers nécessaires pour créer le modèle. La structure du répertoire après l'exécution de cette commande, y compris l'exécution précédente, doit être la suivante.

.
∟ blog
  ∟ admin.py
  ∟ apps.py
  ∟ __init__.py
  ∟ migrations
  ∟ models.py
  ∟ tests.py
  ∟ views.py
∟ composeexample
  ∟ __init__.py
  ∟ __pycache__
  ∟ settings.py
  ∟ urls.py
  ∟ wsgi.py
∟ docker-compose.yaml
∟ Dockerfile
∟ manage.py
∟ migrations
∟ requirements.txt

Comme auparavant, si vous l'exécutez sur une machine Linux, les autorisations de dossier seront root, alors procédez comme suit:

sudo chown -R $USER:$USER .

② Lien avec settings.py

settings.py

settings.py


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

Ajoutez l'application créée cette fois à INSTALLED_APPS.

③ Création de modèle

models.py

blog/models.py


from django.conf import settings
from django.db import models
from django.utils import timezone


class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

Créez une définition de modèle. Il y a models.py dans le dossier du blog créé par startapp, alors modifiez-le. Depuis le début, seule la deuxième ligne, from django.db import models, est empruntée, et l'exemple Django Girls est emprunté.

Commentaire bien compris

from django.conf import settings

Un module utilisé pour faire référence aux variables dans project / settings.py.

from django.db import models

Un module qui fournit diverses méthodes liées au modèle. Clés externes, types de données, etc.

from django.utils import timezone

Module lié au fuseau horaire. C'est presque le même que l'utilitaire fourni dans différentes langues. Cette fois, je l'utilise pour obtenir l'heure au moment de la publication. Puisque le fuseau horaire est défini dans settings.py, il devrait être UTC dans la situation actuelle où rien n'est fait.

class Post(models.Model):

La partie qui définit le modèle appelé Post. Le modèle à définir est créé en héritant de django.db.models.Model. Il est également possible de créer des classes enfants. Par exemple, create_date peut être utilisé dans d'autres modèles à des fins générales, créez donc une classe Timestamp qui définit les données create_date et héritez-en sous la forme Post (Timestamp).

    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

ForeignKey () définit un modèle qui est une clé étrangère. Cette fois, afin de spécifier le modèle User que django a par défaut comme clé externe, la définition MODEL est acquise à l'aide du module de paramètres, mais si vous utilisez normalement le modèle que vous avez créé comme clé externe, le modèle Précisez le nom. L'option on_delete est requise dans django 2.0 ou version ultérieure et spécifie le comportement lors de la suppression d'un objet avec une clé externe. CASCADE supprime tous les objets associés lors de la suppression d'un objet avec une clé externe.

    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

Spécifiez les types de données et les contraintes qui composent le blog. Pour created_date, l'heure à laquelle l'objet a été créé est entrée. Autrement dit, le moment où l'article a été écrit. En revanche, Published_date est vide pour le moment et la valeur est entrée dans la méthode de publication décrite plus loin.

    def publish(self):
        self.published_date = timezone.now()
        self.save()

Une méthode pour publier des articles de blog. L'heure actuelle est affectée à published_date, qui est l'heure de publication, et la méthode save () est appelée. Je ne me souviens pas avoir écrit la méthode save (), donc bien sûr, dans la méthode dans les modèles source d'héritage.Modèle, si la clé primaire existe dans la table, METTEZ-LA À JOUR et si elle n'existe pas, CRÉER

    def __str__(self):
        return self.title

méthode magique. (Comme ce n'est pas le point principal de la méthode magique, veuillez le vérifier vous-même.) Le titre de l'article du blog est renvoyé lorsqu'il est instancié.

④ Migration de base de données

Dans django, la création d'une table dans la base de données connectée au contenu de models.py semble s'appeler migration. Lorsque vous exécutez la commande manage.py makemigrations, un fichier de migration est créé et la commande manage.py migrate crée en fait une table sur la base de données. Entrez immédiatement le serveur Web avec docker-compose exec, exécutez la commande, entrez le serveur de base de données et vérifiez si la table est créée. (Ces opérations seront ajoutées à la commande dans docker-compose plus tard afin que la migration soit effectuée avec docker-compose up, mais maintenant j'entre dans le conteneur et j'exécute la commande pour confirmation)

docker-compose exec web bash

(Ci-après dans le conteneur Web)

manage.py makemigrations blog

La sortie suivante est sortie. blog/migrations/0001_initial.py

manaeg.py migrate blog

Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying blog.0001_initial... OK Si la sortie est comme ci-dessus, la migration est terminée. Quittez le serveur Web avec exit et entrez dans le serveur de base de données pour vérifier.

docker-compose exec db bash

(Ci-après dans le conteneur db)

psql -U postgres
\d

\d Résultat de l'exécution


                        List of relations
 Schema |               Name                |   Type   |  Owner
--------+-----------------------------------+----------+----------
 public | auth_group                        | table    | postgres
 public | auth_group_id_seq                 | sequence | postgres
 public | auth_group_permissions            | table    | postgres
 public | auth_group_permissions_id_seq     | sequence | postgres
 public | auth_permission                   | table    | postgres
 public | auth_permission_id_seq            | sequence | postgres
 public | auth_user                         | table    | postgres
 public | auth_user_groups                  | table    | postgres
 public | auth_user_groups_id_seq           | sequence | postgres
 public | auth_user_id_seq                  | sequence | postgres
 public | auth_user_user_permissions        | table    | postgres
 public | auth_user_user_permissions_id_seq | sequence | postgres
 public | blog_post                         | table    | postgres
 public | blog_post_id_seq                  | sequence | postgres
 public | django_content_type               | table    | postgres
 public | django_content_type_id_seq        | sequence | postgres
 public | django_migrations                 | table    | postgres
 public | django_migrations_id_seq          | sequence | postgres

Il existe de nombreuses tables. auth et django sont probablement créés par défaut (probablement). Depuis que j'ai écrit blog_post dans models.py, vérifiez la définition de la table blog_post.

\d blog_post

\d Résultat de l'exécution


                                         Table "public.blog_post"
     Column     |           Type           | Collation | Nullable |                Default
----------------+--------------------------+-----------+----------+---------------------------------------
 id             | integer                  |           | not null | nextval('blog_post_id_seq'::regclass)
 title          | character varying(200)   |           | not null |
 text           | text                     |           | not null |
 created_date   | timestamp with time zone |           | not null |
 published_date | timestamp with time zone |           |          |
 author_id      | integer                  |           | not null |
Indexes:
    "blog_post_pkey" PRIMARY KEY, btree (id)
    "blog_post_author_id_dd7a8485" btree (author_id)
Foreign-key constraints:
    "blog_post_author_id_dd7a8485_fk_auth_user_id" FOREIGN KEY (author_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED

id est un numéro de série donné par défaut lorsque django définit un modèle, et est la clé primaire. D'autres sont tels que définis dans models.py. Le modèle est maintenant prêt.

Cela ressemble enfin à la deuxième étape, mais faisons-le sans faute. ..

Suite

Recommended Posts

Une série d'ingénieurs d'infrastructure amateurs touchant Django avec Docker (2): création d'un modèle
Une série d'ingénieurs d'infrastructure amateurs touchant Django avec Docker ③: administrateur Django
Créer un serveur Flask avec Docker
Déployer l'application Django avec Docker
Créer un écran de connexion dans Django all auth
[Python] Créer un environnement de développement Django avec Docker
Flux de création d'un environnement virtuel avec Anaconda
Retour sur la création d'un service Web avec Django 1
Retour sur la création d'un service Web avec Django 2
Un mémo sur la création d'une application Django (Python) avec Docker
Lancer Django sur un conteneur Docker à l'aide de docker-compose up
Créez un environnement de développement avec Poetry Django Docker Pycharm
Impressions de toucher Django
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Conception du modèle de base de données)
Créez un environnement de développement Django avec Docker! (Docker-compose / Django / postgreSQL / nginx)
[Memo] Construire un environnement de développement pour Django + Nuxt.js avec Docker
L'histoire du champ de modèle Django disparaissant de la classe
[Django] Créez rapidement un environnement de développement de conteneur Django (Docker) avec PyCharm
Créer une application Todo avec Django ① Créer un environnement avec Docker
(Pour les débutants) Essayez de créer une API Web simple avec Django
Analysez le modèle thématique pour devenir romancier avec GensimPy3
Créer une page d'accueil avec django
Création d'un modèle séquentiel Tensorflow avec une image originale ajoutée à MNIST
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
J'ai créé un environnement de développement pour Django 3.0 avec Docker, Docker-compose, Poetry
[DynamoDB] [Docker] Créer un environnement de développement pour DynamoDB et Django avec docker-compose
Construction d'un environnement distribué avec la série Raspberry PI (Partie 1: Résumé de la disponibilité des clients sans disque par modèle)