데이터베이스 설정

Intermediate

소개

이 튜토리얼은 Creation of a Basic Poll Application 튜토리얼에서 이어진다. 데이터베이스를 설정하고, 첫 번째 모델을 생성하며, Django 의 자동 생성된 관리자 사이트에 대한 간략한 소개를 받게 된다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 65%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

데이터베이스 설정

이제 mysite/settings.py를 열어보세요. Django 설정을 나타내는 모듈 수준 변수를 가진 일반적인 Python 모듈입니다.

기본적으로, 설정은 SQLite 를 사용합니다. 데이터베이스를 처음 접하거나 Django 를 사용해보고 싶다면, 이것이 가장 쉬운 선택입니다. SQLite 는 Python 에 포함되어 있으므로, 데이터베이스를 지원하기 위해 다른 것을 설치할 필요가 없습니다. 하지만 첫 번째 실제 프로젝트를 시작할 때는, 나중에 데이터베이스 전환으로 인한 문제를 피하기 위해 PostgreSQL 과 같은 더 확장 가능한 데이터베이스를 사용하는 것이 좋습니다.

다른 데이터베이스를 사용하려면, 적절한 데이터베이스 바인딩 (database bindings)을 설치하고 DATABASES'default' 항목에서 다음 키를 데이터베이스 연결 설정에 맞게 변경하십시오.

  • ENGINE <DATABASE-ENGINE> -- 'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql', 또는 'django.db.backends.oracle' 중 하나입니다. 다른 백엔드도 사용 가능합니다 <third-party-notes>.
  • NAME -- 데이터베이스의 이름입니다. SQLite 를 사용하는 경우, 데이터베이스는 컴퓨터의 파일이 됩니다. 이 경우, NAME은 해당 파일의 전체 절대 경로 (파일 이름 포함) 여야 합니다. 기본값인 BASE_DIR / 'db.sqlite3'은 프로젝트 디렉토리에 파일을 저장합니다.

SQLite 를 데이터베이스로 사용하지 않는 경우, USER, PASSWORD, HOST와 같은 추가 설정을 추가해야 합니다. 자세한 내용은 DATABASES에 대한 참조 문서를 참조하십시오.

SQLite 이외의 데이터베이스의 경우

SQLite 이외의 데이터베이스를 사용하는 경우, 이 시점에서 데이터베이스를 생성했는지 확인하십시오. 데이터베이스의 대화형 프롬프트 내에서 "CREATE DATABASE database_name;"을 사용하여 수행하십시오.

또한 mysite/settings.py에 제공된 데이터베이스 사용자가 "create database" 권한을 가지고 있는지 확인하십시오. 이렇게 하면 나중에 튜토리얼에서 필요하게 될 테스트 데이터베이스 <the-test-database>를 자동으로 생성할 수 있습니다.

SQLite 를 사용하는 경우, 미리 아무것도 생성할 필요가 없습니다. 데이터베이스 파일은 필요할 때 자동으로 생성됩니다.

mysite/settings.py를 편집하는 동안, TIME_ZONE을 사용자의 시간대로 설정하십시오.

또한 파일 상단의 INSTALLED_APPS 설정을 확인하십시오. 이 설정은 이 Django 인스턴스에서 활성화된 모든 Django 애플리케이션의 이름을 포함합니다. 앱은 여러 프로젝트에서 사용될 수 있으며, 다른 사용자가 자신의 프로젝트에서 사용할 수 있도록 패키징하고 배포할 수 있습니다.

기본적으로, INSTALLED_APPS에는 Django 와 함께 제공되는 다음 앱이 포함되어 있습니다.

  • django.contrib.admin -- 관리자 사이트입니다. 곧 사용하게 됩니다.
  • django.contrib.auth -- 인증 시스템입니다.
  • django.contrib.contenttypes -- 콘텐츠 유형을 위한 프레임워크입니다.
  • django.contrib.sessions -- 세션 프레임워크입니다.
  • django.contrib.messages -- 메시징 프레임워크입니다.
  • django.contrib.staticfiles -- 정적 파일을 관리하기 위한 프레임워크입니다.

이러한 애플리케이션은 일반적인 경우를 위해 기본적으로 포함되어 있습니다.

이러한 애플리케이션 중 일부는 적어도 하나의 데이터베이스 테이블을 사용하므로, 사용하기 전에 데이터베이스에 테이블을 생성해야 합니다. 이를 위해 다음 명령을 실행하십시오.

cd ~/project/mysite
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

migrate 명령은 INSTALLED_APPS 설정을 확인하고, mysite/settings.py 파일의 데이터베이스 설정 및 앱과 함께 제공되는 데이터베이스 마이그레이션에 따라 필요한 데이터베이스 테이블을 생성합니다 (나중에 다룰 것입니다). 적용되는 각 마이그레이션에 대한 메시지가 표시됩니다. 관심이 있다면, 데이터베이스의 명령줄 클라이언트를 실행하고 \dt (PostgreSQL), SHOW TABLES; (MariaDB, MySQL), .tables (SQLite), 또는 SELECT TABLE_NAME FROM USER_TABLES; (Oracle) 을 입력하여 Django 가 생성한 테이블을 표시하십시오.

미니멀리스트를 위한 팁

위에서 언급했듯이, 기본 애플리케이션은 일반적인 경우를 위해 포함되어 있지만, 모든 사람이 필요로 하는 것은 아닙니다. 필요하지 않은 앱이 있거나 모두 필요하지 않은 경우, migrate를 실행하기 전에 INSTALLED_APPS에서 해당 줄을 주석 처리하거나 삭제하십시오. migrate 명령은 INSTALLED_APPS에 있는 앱에 대해서만 마이그레이션을 실행합니다.

모델 생성

이제 모델을 정의합니다. 본질적으로, 추가 메타데이터가 있는 데이터베이스 레이아웃입니다.

모델은 데이터에 대한 단일하고 결정적인 정보 소스입니다. 저장하려는 데이터의 필수 필드와 동작을 포함합니다. Django 는 DRY 원칙 <dry>을 따릅니다. 목표는 데이터 모델을 한 곳에서 정의하고 자동으로 파생하는 것입니다.

여기에는 마이그레이션이 포함됩니다. 예를 들어 Ruby On Rails 와 달리, 마이그레이션은 모델 파일에서 완전히 파생되며, Django 가 데이터베이스 스키마를 현재 모델에 맞게 업데이트하기 위해 롤백할 수 있는 기록입니다.

Poll 앱에서 QuestionChoice의 두 가지 모델을 생성합니다. Question에는 질문과 게시 날짜가 있습니다. Choice에는 두 개의 필드가 있습니다: 선택 텍스트와 투표 집계입니다. 각 ChoiceQuestion과 연결됩니다.

이러한 개념은 Python 클래스로 표현됩니다. 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)

여기서 각 모델은 django.db.models.Model을 서브클래싱하는 클래스로 표현됩니다. 각 모델에는 여러 클래스 변수가 있으며, 각 변수는 모델의 데이터베이스 필드를 나타냅니다.

각 필드는 ~django.db.models.Field 클래스의 인스턴스로 표현됩니다. 예를 들어, 문자 필드의 경우 ~django.db.models.CharField이고, 날짜/시간의 경우 ~django.db.models.DateTimeField입니다. 이것은 Django 에게 각 필드가 어떤 유형의 데이터를 보유하는지 알려줍니다.

~django.db.models.Field 인스턴스의 이름 (예: question_text 또는 pub_date) 은 기계 친화적인 형식의 필드 이름입니다. 이 값을 Python 코드에서 사용하며, 데이터베이스는 이를 열 이름으로 사용합니다.

~django.db.models.Field에 선택적 첫 번째 위치 인수를 사용하여 사람이 읽을 수 있는 이름을 지정할 수 있습니다. 이는 Django 의 몇 가지 자기 성찰적인 부분에서 사용되며, 문서 역할도 합니다. 이 필드가 제공되지 않으면 Django 는 기계가 읽을 수 있는 이름을 사용합니다. 이 예에서는 Question.pub_date에 대해서만 사람이 읽을 수 있는 이름을 정의했습니다. 이 모델의 다른 모든 필드의 경우, 필드의 기계가 읽을 수 있는 이름이 사람이 읽을 수 있는 이름으로 충분합니다.

일부 ~django.db.models.Field 클래스에는 필수 인수가 있습니다. 예를 들어, ~django.db.models.CharField~django.db.models.CharField.max_length를 제공해야 합니다. 이는 데이터베이스 스키마뿐만 아니라 곧 보게 될 유효성 검사에도 사용됩니다.

~django.db.models.Field는 다양한 선택적 인수를 가질 수도 있습니다. 이 경우, votes~django.db.models.Field.default 값을 0 으로 설정했습니다.

마지막으로, ~django.db.models.ForeignKey를 사용하여 관계가 정의되었음을 확인하십시오. 이는 Django 에게 각 Choice가 단일 Question과 관련되어 있음을 알려줍니다. Django 는 모든 일반적인 데이터베이스 관계를 지원합니다: 다대일, 다대다 및 일대일.

모델 활성화

모델 코드의 작은 부분은 Django 에게 많은 정보를 제공합니다. 이를 통해 Django 는 다음을 수행할 수 있습니다.

  • 이 앱에 대한 데이터베이스 스키마 (CREATE TABLE 문) 를 생성합니다.
  • QuestionChoice 객체에 액세스하기 위한 Python 데이터베이스 액세스 API 를 생성합니다.

하지만 먼저 프로젝트에 polls 앱이 설치되었음을 알려야 합니다.

Django 앱은 "플러그 가능"합니다. 여러 프로젝트에서 앱을 사용할 수 있으며, 특정 Django 설치에 묶여 있을 필요가 없으므로 앱을 배포할 수 있습니다.

프로젝트에 앱을 포함하려면, INSTALLED_APPS 설정에 해당 구성 클래스에 대한 참조를 추가해야 합니다. PollsConfig 클래스는 polls/apps.py 파일에 있으므로, 점으로 구분된 경로는 'polls.apps.PollsConfig'입니다. mysite/settings.py 파일을 편집하고 해당 점으로 구분된 경로를 INSTALLED_APPS 설정에 추가합니다. 다음과 같이 표시됩니다.

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 앱을 포함해야 함을 알고 있습니다. 다른 명령을 실행해 보겠습니다.

python manage.py makemigrations polls

다음과 유사한 내용이 표시됩니다.

Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice

makemigrations를 실행하면, 모델에 몇 가지 변경 사항을 적용했음을 (이 경우, 새로운 모델을 만들었음) Django 에게 알리고, 변경 사항을 마이그레이션으로 저장하려고 합니다.

마이그레이션은 Django 가 모델 (및 데이터베이스 스키마) 에 대한 변경 사항을 저장하는 방법입니다. 디스크의 파일입니다. 새 모델에 대한 마이그레이션을 읽을 수 있습니다. polls/migrations/0001_initial.py 파일입니다. 걱정하지 마세요. Django 가 마이그레이션을 만들 때마다 읽을 필요는 없지만, Django 가 변경 사항을 변경하는 방식을 수동으로 조정하려는 경우 사람이 편집할 수 있도록 설계되었습니다.

마이그레이션을 실행하고 데이터베이스 스키마를 자동으로 관리하는 명령이 있습니다. 이를 migrate라고 하며, 잠시 후에 살펴보겠습니다. 먼저, 해당 마이그레이션이 실행할 SQL 을 살펴보겠습니다. sqlmigrate 명령은 마이그레이션 이름을 가져와 해당 SQL 을 반환합니다.

python manage.py sqlmigrate polls 0001

다음과 유사한 내용이 표시됩니다 (가독성을 위해 형식을 변경했습니다).

BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
    "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    "question_text" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
    "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    "choice_text" varchar(200) NOT NULL,
    "votes" integer NOT NULL,
    "question_id" bigint NOT NULL
);
ALTER TABLE "polls_choice"
  ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
    FOREIGN KEY ("question_id")
    REFERENCES "polls_question" ("id")
    DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");

COMMIT;

다음 사항에 유의하십시오.

  • 정확한 출력은 사용 중인 데이터베이스에 따라 다릅니다. 위의 예는 PostgreSQL 에 대해 생성되었습니다.
  • 테이블 이름은 앱 이름 (polls) 과 모델의 소문자 이름 (questionchoice) 을 결합하여 자동으로 생성됩니다. (이 동작을 재정의할 수 있습니다.)
  • 기본 키 (ID) 가 자동으로 추가됩니다. (이것도 재정의할 수 있습니다.)
  • 관례적으로, Django 는 외래 키 필드 이름에 "_id"를 추가합니다. (예, 이것도 재정의할 수 있습니다.)
  • 외래 키 관계는 FOREIGN KEY 제약 조건으로 명시적으로 설정됩니다. DEFERRABLE 부분에 대해 걱정하지 마십시오. 이는 PostgreSQL 에게 트랜잭션이 끝날 때까지 외래 키를 적용하지 않도록 지시하는 것입니다.
  • 사용 중인 데이터베이스에 맞게 조정되므로, auto_increment(MySQL), bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY(PostgreSQL) 또는 integer primary key autoincrement(SQLite) 와 같은 데이터베이스별 필드 유형이 자동으로 처리됩니다. 필드 이름의 인용에도 동일하게 적용됩니다. 예를 들어, 큰따옴표 또는 작은따옴표를 사용합니다.
  • sqlmigrate 명령은 실제로 데이터베이스에서 마이그레이션을 실행하지 않습니다. 대신, Django 가 필요하다고 생각하는 SQL 을 화면에 출력하여 Django 가 무엇을 할 것인지 확인하거나 변경 사항에 대한 SQL 스크립트가 필요한 데이터베이스 관리자가 있는 경우 유용합니다.

관심이 있다면, python manage.py check <check>를 실행할 수도 있습니다. 이는 마이그레이션을 수행하거나 데이터베이스를 건드리지 않고 프로젝트의 문제를 확인합니다.

이제 migrate를 다시 실행하여 데이터베이스에 해당 모델 테이블을 생성합니다.

python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0001_initial... OK

migrate 명령은 적용되지 않은 모든 마이그레이션 (Django 는 데이터베이스의 특수 테이블인 django_migrations를 사용하여 적용된 마이그레이션을 추적합니다) 을 가져와 데이터베이스에 대해 실행합니다. 본질적으로, 모델에 대한 변경 사항을 데이터베이스의 스키마와 동기화합니다.

마이그레이션은 매우 강력하며, 프로젝트를 개발하면서 데이터베이스나 테이블을 삭제하고 새 테이블을 만들 필요 없이 모델을 변경할 수 있습니다. 데이터를 잃지 않고 데이터베이스를 실시간으로 업그레이드하는 데 특화되어 있습니다. 튜토리얼의 뒷부분에서 더 자세히 다루겠지만, 지금은 모델 변경을 위한 세 단계 가이드를 기억하십시오.

  • 모델을 변경합니다 (models.py에서).
  • python manage.py makemigrations <makemigrations>를 실행하여 해당 변경 사항에 대한 마이그레이션을 생성합니다.
  • python manage.py migrate <migrate>를 실행하여 해당 변경 사항을 데이터베이스에 적용합니다.

마이그레이션을 만들고 적용하는 별도의 명령이 있는 이유는 마이그레이션을 버전 관리 시스템에 커밋하고 앱과 함께 제공하기 때문입니다. 이는 개발을 더 쉽게 만들 뿐만 아니라 다른 개발자와 프로덕션에서도 사용할 수 있습니다.

manage.py 유틸리티가 수행할 수 있는 모든 정보는 django-admin documentation </ref/django-admin>을 참조하십시오.

API 사용해보기

이제 대화형 Python 셸에 들어가 Django 가 제공하는 무료 API 를 사용해 보겠습니다. Python 셸을 호출하려면 다음 명령을 사용하십시오.

python manage.py shell

"python"을 단순히 입력하는 대신 이것을 사용하고 있습니다. manage.pyDJANGO_SETTINGS_MODULE 환경 변수를 설정하여 Django 에게 mysite/settings.py 파일에 대한 Python import 경로를 제공합니다.

셸에 들어가면 database API </topics/db/queries>를 탐색하십시오.

>>> from polls.models import Choice, Question  ## 방금 작성한 모델 클래스를 가져옵니다.

## 아직 시스템에 질문이 없습니다.
>>> Question.objects.all()
<QuerySet []>

## 새 질문을 만듭니다.
## 기본 설정 파일에서 시간대 지원이 활성화되어 있으므로
## Django 는 pub_date 에 tzinfo 가 있는 datetime 을 예상합니다. datetime.datetime.now() 대신 timezone.now() 를 사용하면
## 올바르게 작동합니다.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

## 객체를 데이터베이스에 저장합니다. save() 를 명시적으로 호출해야 합니다.
>>> q.save()

## 이제 ID 가 있습니다.
>>> q.id
1

## Python 속성을 통해 모델 필드 값에 액세스합니다.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2023, 9, 7, 1, 18, 48, 335644, tzinfo=datetime.timezone.utc)

## 속성을 변경한 다음 save() 를 호출하여 값을 변경합니다.
>>> q.question_text = "What's up?"
>>> q.save()

## objects.all() 은 데이터베이스의 모든 질문을 표시합니다.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

잠깐만요. <Question: Question object (1)>은 이 객체의 유용한 표현이 아닙니다. Question 모델 ( polls/models.py 파일) 을 편집하고 QuestionChoice 모두에 ~django.db.models.Model.__str__ 메서드를 추가하여 이를 수정해 보겠습니다.

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

대화형 프롬프트를 처리할 때뿐만 아니라 객체의 표현이 Django 의 자동 생성된 관리자 전체에서 사용되기 때문에 모델에 ~django.db.models.Model.__str__ 메서드를 추가하는 것이 중요합니다.

이 모델에 사용자 지정 메서드도 추가해 보겠습니다.

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)

Python 의 표준 datetime 모듈과 Django 의 시간대 관련 유틸리티를 각각 django.utils.timezone에서 참조하기 위해 import datetimefrom django.utils import timezone이 추가된 것을 확인하십시오. Python 에서 시간대 처리에 익숙하지 않은 경우, time zone support docs </topics/i18n/timezones>에서 자세한 내용을 확인할 수 있습니다.

이러한 변경 사항을 저장하고 python manage.py shell을 다시 실행하여 새 Python 대화형 셸을 시작합니다.

>>> from polls.models import Choice, Question

## __str__() 추가가 작동하는지 확인합니다.
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>

## Django 는 키워드 인수로 완전히 구동되는 풍부한 데이터베이스 조회 API 를 제공합니다.
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith="What")
<QuerySet [<Question: What's up?>]>

## 올해 게시된 질문을 가져옵니다.
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>

## 존재하지 않는 ID 를 요청하면 예외가 발생합니다.
>>> Question.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Question matching query does not exist.

## 기본 키로 조회가 가장 일반적인 경우이므로 Django 는 기본 키 정확 조회를 위한 바로 가기를 제공합니다.
## 다음은 Question.objects.get(id=1) 과 동일합니다.
>>> Question.objects.get(pk=1)
<Question: What's up?>

## 사용자 지정 메서드가 작동하는지 확인합니다.
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True

## Question 에 몇 가지 Choice 를 제공합니다. create 호출은 새
## Choice 객체를 구성하고, INSERT 문을 실행하고, 선택 항목을
## 사용 가능한 선택 항목 집합에 추가하고 새 Choice 객체를 반환합니다. Django 는
## ForeignKey 관계의 "다른 쪽"(예: 질문의 선택) 을 보유할 집합을 만듭니다.
## API 를 통해 액세스할 수 있습니다.
>>> q = Question.objects.get(pk=1)

## 관련 객체 집합의 선택 항목을 표시합니다. 아직 없습니다.
>>> q.choice_set.all()
<QuerySet []>

## 세 가지 선택 항목을 만듭니다.
>>> 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 객체는 관련 Question 객체에 대한 API 액세스 권한을 갖습니다.
>>> c.question
<Question: What's up?>

## 그리고 그 반대도 마찬가지입니다. Question 객체는 Choice 객체에 대한 액세스 권한을 얻습니다.
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3

## API 는 필요에 따라 관계를 자동으로 따릅니다.
## 관계를 구분하려면 밑줄 두 개를 사용합니다.
## 이것은 원하는 만큼 여러 수준에서 작동합니다. 제한이 없습니다.
## pub_date 가 올해인 질문에 대한 모든 Choice 를 찾습니다.
## (위에서 만든 'current_year' 변수를 재사용합니다).
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

## 선택 항목 중 하나를 삭제해 보겠습니다. delete() 를 사용합니다.
>>> c = q.choice_set.filter(choice_text__startswith="Just hacking")
>>> c.delete()

모델 관계에 대한 자세한 내용은 Accessing related objects </ref/models/relations>를 참조하십시오. API를 통해 필드 조회를 수행하기 위해 밑줄 두 개를 사용하는 방법에 대한 자세한 내용은 Field lookups <field-lookups-intro>를 참조하십시오. 데이터베이스 API에 대한 자세한 내용은 Database API reference </topics/db/queries>를 참조하십시오.

Django Admin 소개

직원이나 고객이 콘텐츠를 추가, 변경 및 삭제할 수 있도록 관리자 사이트를 생성하는 것은 창의성이 많이 필요하지 않은 지루한 작업입니다. 이러한 이유로 Django 는 모델에 대한 관리자 인터페이스 생성을 완전히 자동화합니다.

Django 는 "콘텐츠 게시자"와 "공개" 사이트 간에 매우 명확한 구분이 있는 뉴스룸 환경에서 작성되었습니다. 사이트 관리자는 시스템을 사용하여 뉴스 기사, 이벤트, 스포츠 점수 등을 추가하고 해당 콘텐츠는 공개 사이트에 표시됩니다. Django 는 사이트 관리자가 콘텐츠를 편집할 수 있는 통합 인터페이스를 만드는 문제를 해결합니다.

관리자는 사이트 방문자가 사용하도록 설계되지 않았습니다. 사이트 관리자를 위한 것입니다.

관리자 사용자 생성

먼저 관리자 사이트에 로그인할 수 있는 사용자를 생성해야 합니다. 다음 명령을 실행합니다.

python manage.py createsuperuser

원하는 사용자 이름을 입력하고 Enter 키를 누릅니다.

Username: admin

그런 다음 원하는 이메일 주소를 입력하라는 메시지가 표시됩니다.

Email address: admin@example.com

마지막 단계는 비밀번호를 입력하는 것입니다. 비밀번호를 두 번 입력하라는 메시지가 표시되며, 두 번째는 첫 번째의 확인입니다.

Password: 12345678
Password (again): 12345678

This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

개발 서버 시작

Django 관리자 사이트는 기본적으로 활성화되어 있습니다. 개발 서버를 시작하고 탐색해 보겠습니다.

서버가 실행 중이지 않은 경우 다음과 같이 시작합니다.

python manage.py runserver

이제 VNC 탭에서 웹 브라우저를 열고 로컬 도메인의 "/admin/"으로 이동합니다. 예를 들어, http://127.0.0.1:8000/admin/. 관리자의 로그인 화면이 표시됩니다.

Django admin login screen

translation </topics/i18n/translation>이 기본적으로 켜져 있으므로, LANGUAGE_CODE를 설정하면 로그인 화면이 지정된 언어로 표시됩니다 (Django 에 적절한 번역이 있는 경우).

관리자 사이트 입력

이제 이전 단계에서 생성한 슈퍼유저 계정으로 로그인해 보십시오. Django 관리자 인덱스 페이지가 표시됩니다.

Django admin index page

그룹 및 사용자와 같이 편집 가능한 콘텐츠가 몇 가지 표시됩니다. 이는 Django 에서 제공하는 인증 프레임워크인 django.contrib.auth에서 제공합니다.

설문 앱을 관리자에서 수정 가능하게 만들기

하지만 설문 앱은 어디에 있습니까? 관리자 인덱스 페이지에 표시되지 않습니다.

해야 할 일이 하나 더 있습니다. 관리자에게 Question 객체에 관리자 인터페이스가 있음을 알려야 합니다. 이렇게 하려면 polls/admin.py 파일을 열고 다음과 같이 편집합니다.

from django.contrib import admin

from .models import Question

admin.site.register(Question)

무료 관리자 기능 탐색

이제 Question을 등록했으므로 Django 는 관리자 인덱스 페이지에 표시해야 함을 알고 있습니다.

Django admin index page, now with polls displayed

"Questions"를 클릭합니다. 이제 질문에 대한 "변경 목록" 페이지에 있습니다. 이 페이지는 데이터베이스의 모든 질문을 표시하고 변경할 질문을 선택할 수 있도록 합니다. 앞서 생성한 "What's up?" 질문이 있습니다.

Polls change list page

"What's up?" 질문을 클릭하여 편집합니다.

Editing a poll question

여기서 주목할 사항은 다음과 같습니다.

  • 양식은 Question 모델에서 자동으로 생성됩니다.
  • 서로 다른 모델 필드 유형 (~django.db.models.DateTimeField, ~django.db.models.CharField) 은 적절한 HTML 입력 위젯에 해당합니다. 각 필드 유형은 Django 관리자에서 자체적으로 표시하는 방법을 알고 있습니다.
  • ~django.db.models.DateTimeField은 무료 JavaScript 바로 가기를 얻습니다. 날짜는 "Today" 바로 가기 및 캘린더 팝업을 얻고, 시간은 "Now" 바로 가기 및 일반적으로 입력된 시간을 나열하는 편리한 팝업을 얻습니다.

페이지 하단에는 몇 가지 옵션이 있습니다.

  • 저장 - 변경 사항을 저장하고 이 유형의 객체에 대한 변경 목록 페이지로 돌아갑니다.
  • 저장 및 계속 편집 - 변경 사항을 저장하고 이 객체에 대한 관리자 페이지를 다시 로드합니다.
  • 저장 및 다른 항목 추가 - 변경 사항을 저장하고 이 유형의 객체에 대한 새 빈 양식을 로드합니다.
  • 삭제 - 삭제 확인 페이지를 표시합니다.

"게시 날짜"의 값이 기본 설문 애플리케이션 생성에서 질문을 생성했을 때의 시간과 일치하지 않으면, TIME_ZONE 설정을 올바르게 설정하는 것을 잊었을 가능성이 큽니다. 변경하고 페이지를 다시 로드하여 올바른 값이 나타나는지 확인하십시오.

"Today" 및 "Now" 바로 가기를 클릭하여 "게시 날짜"를 변경합니다. 그런 다음 오른쪽 상단에서 "History"를 클릭합니다. Django 관리자를 통해 이 객체에 대해 수행된 모든 변경 사항을 타임스탬프 및 변경을 수행한 사용자와 함께 나열하는 페이지가 표시됩니다.

History page for question object

모델 API 에 익숙해지고 관리자 사이트에 익숙해지면, 설문 앱에 더 많은 보기를 추가하는 방법을 배우려면 공개 인터페이스 보기 생성을 읽어보십시오.

요약

축하합니다! 데이터베이스 설정 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.