Cet article est une série qui fait progresser le didacticiel officiel de Django. Cette fois, nous allons passer au deuxième article, "Création de votre première application Django, partie 2."
Résumé du tutoriel Django pour les débutants par les débutants ① (création de projet ~) Résumé du tutoriel Django pour les débutants par les débutants ② (Modèle, Admin) Résumé du tutoriel Django pour les débutants par les débutants ③ (Afficher) Résumé du tutoriel Django pour les débutants par les débutants ④ (Vue générique) Résumé du tutoriel Django pour les débutants par les débutants ⑤ (test) Résumé du tutoriel Django pour les débutants par les débutants ⑥ (fichier statique) Résumé des tutoriels Django pour les débutants par les débutants ⑦ (Customize Admin)
https://docs.djangoproject.com/ja/3.0/intro/tutorial02/
Par défaut, Django utilise SQlite.
Définissez la base de données dans mysite / settings.py
.
mysite/settings.py
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
Changez la base de données en changeant ENGINE en django.db.backends.sqlite3
, django.db.backends.postgresql
, django.db.backends.mysql
ou django.db.backends.oracle
Je peux le faire.
En dehors de cela, il est nécessaire d'ajouter des paramètres tels que «UTILISATEUR», «MOT DE PASSE» et «HÔTE» en fonction de la base de données.
Pour le moment, c'est un tutoriel, donc j'aimerais utiliser SQLite tel quel.
Comme pour Rails, il est nécessaire de créer une base de données, utilisez donc la commande suivante pour migrer.
$ python manage.py migrate
Jetons un coup d'œil à l'autre mysite / settings.py
.
Définissez le fuseau horaire que vous souhaitez définir dans TIME_ZONE
.
ʻINSTALLED_APPS` liste les applications Django qui sont activées dans votre projet.
Revenons à l'application de sondages et créons un modèle.
polls/models.py
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)
En tant que débutant en Python, dans la classe Question (models.Model):
part? est devenu. Cela semble indiquer que la classe Question
est une sous-classe de models.Model
(plus précisément, django.db.models.Model
).
Le contenu est facile à comprendre une fois que vous l'avez lu.
Peut-être que chaque table de la base de données est représentée comme une classe et chaque champ est représenté par une instance.
Vous pouvez également voir que chaque champ est spécifié avec des valeurs et des conditions par défaut comme arguments.
Vous pouvez également voir que Choice est lié à Question dans la classe Choice.
Activez le modèle précédent.
Revenez à mysite / settings.py
et ajoutez polls.apps.PollsConfig
dans ʻINSTALLED_APPS`.
mysite/settings.py
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Vous avez maintenant ajouté l'application à votre projet.
Ensuite, générez un fichier de migration qui ajoute des tables, etc. à la base de données.
$ python manage.py makemigrations polls
Le fichier de migration généré a ce format.
polls/migrations/0001_initial.py
# Generated by Django 3.0.1 on 2020-01-02 09:09
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Question',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('question_text', models.CharField(max_length=200)),
('pub_date', models.DateTimeField(verbose_name='date published')),
],
),
migrations.CreateModel(
name='Choice',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('choice_text', models.CharField(max_length=200)),
('votes', models.IntegerField(default=0)),
('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.Question')),
],
),
]
Exécutez la migration avec la commande suivante
$ python manage.py migrate
$ python manage.py shell
Vous pouvez maintenant démarrer le shell Django.
python
>>> from polls.models import Choice, Question # Import the model classes we just wrote.
# No questions are in the system yet.
>>> Question.objects.all()
<QuerySet []>
# Create a new Question.
# Support for time zones is enabled in the default settings file, so
# Django expects a datetime with tzinfo for pub_date. Use timezone.now()
# instead of datetime.datetime.now() and it will do the right thing.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# Save the object into the database. You have to call save() explicitly.
>>> q.save()
# Now it has an ID.
>>> 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() displays all the questions in the database.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
Vous pouvez également jouer avec la base de données avec Shell. (Je ne l'ai jamais fait, mais puis-je le faire avec Rails ou Phoenix?)
À la toute fin, <QuerySet [<Question: Question object (1)>]>
, il est difficile de comprendre quel type d'objet existe, alors ajoutez __str__ ()
à polls / models.py
.
Il semble que «str ()» en Python soit l'une des méthodes spéciales qui renvoie un objet sous forme de chaîne de caractères. Méthodes spéciales de base et str
polls/models.py
from django.db import models
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
Ajoutons une autre méthode à la classe Question.
polls/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() - datetime.timedelta(days=1)
Cliquez ici pour timedelta was_published_recently renvoie si la question passée dans l'argument a été publiée dans un délai d'un jour à compter de l'heure actuelle.
Essayons ces derniers dans Shell.
python
>>> from polls.models import Choice, Question
# Make sure our __str__() addition worked.
>>> Question.objects.all()
<QuerySet [<Question: Whats up?>]>
# Django provides a rich database lookup API that's entirely driven by
# keyword arguments.
>>> Question.objects.filter(id=1)
<QuerySet [<Question: Whats up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: Whats up?>]>
# Get the question that was published this year.
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: Whats up?>
# Request an ID that doesn't exist, this will raise an exception.
>>> 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: Whats up?>
# 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()
<QuerySet []>
# Create three choices.
>>> 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)
# Choice objects have API access to their related Question objects.
>>> c.question
<Question: Whats up?>
# And vice versa: Question objects get access to Choice objects.
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
# The API automatically follows relationships as far as you need.
# Use double underscores to separate relationships.
# This works as many levels deep as you want; there's no limit.
# Find all Choices for any question whose pub_date is in this year
# (reusing the 'current_year' variable we created above).
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
# Let's delete one of the choices. Use delete() for that.
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()
Veuillez vous référer aux articles suivants pour le filtre
etc.
Bases du modèle d'accès aux données
Créer un utilisateur administrateur
$ python manage.py createsuperuser
Cela vous invitera à entrer le nom d'utilisateur, etc., alors entrez-le correctement.
Démarrez le serveur.
$ python manage.py runserver
Et lorsque vous accédez à http://127.0.0.1:8000/admin/
L'écran de connexion de l'administrateur apparaîtra comme ceci, alors entrez celui que vous avez défini précédemment et connectez-vous.
![スクリーンショット 2020-01-02 20.36.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417600/34fc34d0-bdd5-9bda-1964-21c9a605f886. png)
Si vous vous connectez avec succès, vous serez redirigé vers un écran comme celui-ci. Actuellement, seuls les groupes et les utilisateurs peuvent être modifiés.
polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
Vous devriez maintenant voir les questions sur le site d'administration
Essayez d'appuyer sur Question.
Vous pouvez créer de nouvelles questions sur cette page.
En outre, ce qui est UP? Créé avec Shell plus tôt est affiché. Lorsque vous appuyez dessus, le formulaire d'édition sera affiché comme indiqué ci-dessous.
À partir de là, vous pouvez également modifier la question, afficher l'historique des modifications, etc.