Ravi de vous rencontrer, tout le monde. Je publierai le processus de création d'une application de vote (sondage) en utilisant Django comme mémorandum. Puisque je suis un débutant de Qiita, veuillez comprendre qu'il peut être difficile à lire.
séries
Le didacticiel Django utilise SQLite (SGBDR léger). (Il est indiqué qu'il est préférable d'utiliser la base de données OSS extensible dans l'environnement de production.)
Lorsque vous utilisez une base de données autre que SQLite, modifiez DATABASE> default> ENGINE. Vous devez également définir des paramètres supplémentaires tels que USER, PASSWORD et HOST.
condig/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
Migrez la base de données. La traduction littérale de «migrer» signifie «déplacer / migrer», est-il donc correct de comprendre que c'est une fonction pour créer et valider la définition de la base de données utilisée dans l'application?
(poll-HcNSSqhc) C:\django\poll>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... 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 auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
(poll-HcNSSqhc) C:\django\poll>
Créez un modèle pour MVC. Le modèle est une fonction qui traite les données via DB. Dans polls / models.py, spécifiez les tables et colonnes DB.
polls/modeles.py
from django.db import models
# Create your models here.
#Tableau: sondages_Question
#Colonne: question_text VARCHAR(200), pub_date DATETIME
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('data published')
#Tableau: sondages_Choice
#Colonne: question ÉTRANGER(CASCADE) KEY, choice_text VARCHAR(200), votes INTEGER
# CASCADE=Contrainte de clé externe Suit le changement de destination de référence Elle est supprimée dès qu'il n'y a pas de destination de référence
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
Enregistrez l'installation de l'application polls (voir la classe PollsConfig) dans le projet de configuration.
polls/apps.py
from django.apps import AppConfig
class PollsConfig(AppConfig):
name = 'polls'
Écrivez polls / apps.py> PollsConfig dans config / setting.py avec des points.
config/setting.py
INSTALLED_APPS = [
'polls.apps.PollsConfig'
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Migration de base de données. Nous allons changer le modèle, mais ce n'est qu'un fichier temporaire et ne sera pas migré (validé) vers la base de données.
(poll-HcNSSqhc) C:\django\poll>python manage.py makemigrations polls
Migrations for 'polls':
polls\migrations\0001_initial.py
- Create model Question
- Create model Choice
(poll-HcNSSqhc) C:\django\poll>
Vous pouvez vérifier le fonctionnement réel de la migration de base de données comme suit. SQL tel que CREATE TABLE, CREATE INDEX, COMMIT a été émis.
(poll-HcNSSqhc) C:\django\poll>python manage.py sqlmigrate polls 0001
BEGIN;
--
-- 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);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT NULL REFERENCES "polls_question" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
(poll-HcNSSqhc) C:\django\poll>
Migrer la base de données. Autrement dit, engagez-vous dans DB.
(poll-HcNSSqhc) C:\django\poll>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK
(poll-HcNSSqhc) C:\django\poll>
Commençons Python en mode interactif.
(poll-HcNSSqhc) C:\django\poll>python manage.py shell
Python 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:37:30) [MSC v.1927 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Nous allons exploiter la base de données avec shell. Chargez les classes Choice et Question à partir du fichier polls / models.py. Il n'y a pas encore d'objets (questions).
>>> from polls.models import Choice,Question
>>> Question.objects.all()
<QuerySet []>
>>>
Créez un objet (question).
>>> from django.utils import timezone
>>>
>>> q=Question(question_text="What's new?",pub_date=timezone.now())
>>> q.save()
>>>
>>> q.id
1
>>>
>>> q.question_text
"What's new?"
>>>
>>> q.pub_date
datetime.datetime(2020, 10, 6, 8, 27, 6, 527001, tzinfo=<UTC>)
>>>
Enregistrez et vérifiez l'objet (question). Puisque la valeur de retour est 1, elle semble exister.
>>> q.save()
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
>>>
Cependant, avec une valeur de retour de 1, le contenu de l'objet est inconnu. Montrons le contenu. Modifiez polls / models.py.
polls/modeles.py
import datetime
from django.db import models
from django.utils import timezone
# Create your models here.
#Tableau: sondages_Question
#Colonne: question_text VARCHAR(200), pub_date DATETIME
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('data published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
#Tableau: sondages_Choice
#Colonne: question ÉTRANGER(CASCADE) KEY, choice_text VARCHAR(200), votes INTEGER(Valeur initiale 0)
# CASCADE=Contrainte de clé externe Suit le changement de destination de référence Elle est supprimée dès qu'il n'y a pas de destination de référence
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
Vérifiez à nouveau l'objet (question)
>>> from polls.models import Choice, Question
>>>
>>> Question.objects.all()
<QuerySet [<Question: What's>]>
>>>
Voyons comment récupérer diverses données.
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's>]>
>>>
>>> Question.objects.get(pk=1)
<Question: What's>
>>>
Déterminez si la date du vote (pub_date) se situe dans la journée.
>>> q = Question.objects.get(pk=1)
>>>
>>> q.was_published_recently()
True
>>>
Créez des données pour la table Choix auxquelles la question fait référence en externe. Autrement dit, créez un choix pour la question. À l'heure actuelle, la relation question-choix est un-à-plusieurs.
#Déclarer de créer des options pour une question particulière
>>> q.choice_set.all()
<QuerySet []>
>>>
#Créer 3 choix Objet Question → Accéder à l'objet Choix
>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>>
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
>>>
#Objet de choix → L'objet Question est également accessible
>>> c.question
<Question: What''s this?>
>>>
#Vérifiez toutes les options
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>>
>>> q.choice_set.count()
3
>>>
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>>
#Supprimer un choix
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()
(1, {'polls.Choice': 1})
>>>
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>]>
>>>
(poll-HcNSSqhc) C:\django\poll>python manage.py createsuperuser
Username (leave blank to use '***'): admin
Email address: [email protected]
Password:
Password (again):
The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
(poll-HcNSSqhc) C:\django\poll>
(poll-HcNSSqhc) C:\django\poll>python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
October 06, 2020 - 21:09:30
Django version 3.1.2, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Accédez à http://127.0.0.1:8000/admin/.
Lorsque vous vous connectez, vous verrez un écran comme celui-ci.
Ajoutez à polls / admin.py.
polls/admin.py
from django.contrib import admin
# Register your models here.
from .mdoeles import Question
admin.site.register(Question)
L'application Question for Polls a été ajoutée.
À la destination où j'ai cliqué sur Question et effectué la transition, il y avait "Qu'est-ce que c'est?" Il semble que vous puissiez créer ou modifier de nouvelles questions.
Aujourd'hui, c'est ici. Merci beaucoup.
Recommended Posts