Dieser Artikel ist eine Reihe, die das offizielle Django-Tutorial weiterentwickelt. Dieses Mal fahren wir mit dem zweiten Artikel fort: "Erstellen Ihrer ersten Django-App, Teil 2."
Zusammenfassung des Django-Tutorials für Anfänger von Anfängern ① (Projekterstellung ~) Django-Tutorial-Zusammenfassung für Anfänger von Anfängern Model (Model, Admin) Zusammenfassung des Django-Tutorials für Anfänger von Anfängern ③ (Anzeigen) Zusammenfassung des Django-Tutorials für Anfänger von Anfängern ④ (generische Ansicht) Django Tutorial Zusammenfassung für Anfänger von Anfängern ⑤ (Test) Django Tutorial Zusammenfassung für Anfänger von Anfängern ⑥ (statische Datei) Zusammenfassung der Django-Tutorials für Anfänger durch Anfänger ⑦ (Admin anpassen)
https://docs.djangoproject.com/ja/3.0/intro/tutorial02/
Standardmäßig verwendet Django SQlite.
Stellen Sie die Datenbank in mysite / settings.py
ein.
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'),
}
}
Ändern Sie die Datenbank, indem Sie ENGINE in "django.db.backends.sqlite3", "django.db.backends.postgresql", "django.db.backends.mysql" oder "django.db.backends.oracle" ändern Ich kann es schaffen
Ansonsten müssen je nach Datenbank Einstellungen wie "USER", "PASSWORD" und "HOST" hinzugefügt werden.
Derzeit handelt es sich um ein Tutorial, daher möchte ich SQLite so wie es ist verwenden.
Wie bei Rails muss eine Datenbank erstellt werden. Verwenden Sie daher zum Migrieren den folgenden Befehl.
$ python manage.py migrate
Werfen wir einen Blick auf die andere mysite / settings.py
.
Stellen Sie die Zeitzone, die Sie einstellen möchten, in "TIME_ZONE" ein.
INSTALLED_APPS
listet die Django-Anwendungen auf, die in Ihrem Projekt aktiviert sind.
Kehren wir zur Umfrage-App zurück und erstellen ein Modell.
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)
Als Python-Anfänger in der Klasse Frage (models.Model):
Teil? ist geworden. Dies scheint darauf hinzudeuten, dass die Klasse "Question" eine Unterklasse von "models.Model" ist (genauer gesagt "django.db.models.Model").
Der Inhalt ist leicht zu verstehen, sobald Sie ihn gelesen haben.
Möglicherweise wird jede Tabelle in der Datenbank als Klasse dargestellt, und jedes Feld wird durch eine Instanz in der Datenbank dargestellt.
Sie können auch sehen, dass jedes Feld mit Standardwerten und -bedingungen als Argumente angegeben wird.
Sie können auch sehen, dass Auswahl in der Auswahlklasse an Frage gebunden ist.
Aktivieren Sie das Vorgängermodell.
Gehen Sie zurück zu "mysite / settings.py" und fügen Sie "polls.apps.PollsConfig" in "INSTALLED_APPS" hinzu.
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',
]
Sie haben die Anwendung jetzt zu Ihrem Projekt hinzugefügt.
Generieren Sie als Nächstes eine Migrationsdatei, die der Datenbank Tabellen usw. hinzufügt.
$ python manage.py makemigrations polls
Die generierte Migrationsdatei hat dieses 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')),
],
),
]
Führen Sie die Migration mit dem folgenden Befehl aus
$ python manage.py migrate
$ python manage.py shell
Sie können jetzt die Django-Shell starten.
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)>]>
Sie können auch mit der DB mit Shell spielen. (Ich habe es noch nie gemacht, aber kann ich es mit Rails oder Phoenix machen?)
Ganz am Ende, <QuerySet [<Question: Question object (1)>]>, ist es schwierig zu verstehen, welche Art von Objekt vorhanden ist. Fügen Sie also __str __ ()
zu polls / models.py
hinzu.
Es scheint, dass str () in Python eine der speziellen Methoden ist, die ein Objekt als Zeichenfolge zurückgibt. Grundlegende spezielle Methoden und 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
Fügen wir der Question-Klasse eine weitere Methode hinzu.
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)
Klicken Sie hier für timedelta was_published_recently gibt zurück, ob die im Argument übergebene Frage innerhalb eines Tages nach der aktuellen Zeit veröffentlicht wurde.
Versuchen wir dies in 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()
In den folgenden Artikeln finden Sie Informationen zu den darin enthaltenen "Filtern" usw. Modellgrundlagen des Datenzugriffs
Erstellen Sie einen Administrator
$ python manage.py createsuperuser
Dadurch werden Sie aufgefordert, den Benutzernamen usw. einzugeben. Geben Sie ihn daher entsprechend ein.
Starten Sie den Server.
$ python manage.py runserver
Und wenn Sie auf http://127.0.0.1:8000/admin/ zugreifen
Der Administrator-Anmeldebildschirm wird folgendermaßen angezeigt. Geben Sie also den zuvor festgelegten ein und melden Sie sich an.
![スクリーンショット 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)
Wenn Sie sich erfolgreich anmelden, werden Sie zu einem Bildschirm wie diesem weitergeleitet. Derzeit können nur Gruppen und Benutzer bearbeitet werden.
polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
Sie sollten jetzt die Fragen auf der Admin-Site sehen
Versuchen Sie, Frage zu drücken.
Auf dieser Seite können Sie neue Fragen erstellen.
Außerdem wird angezeigt, was UP ist, das zuvor mit Shell erstellt wurde. Wenn Sie darauf drücken, wird das Bearbeitungsformular wie unten gezeigt angezeigt.
Von hier aus können Sie auch die Frage bearbeiten, den Bearbeitungsverlauf anzeigen und vieles mehr.
Recommended Posts