English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Django 빠른 시작-데이터베이스 모델 상세 작업 강의
이 시리즈 강의의 첫 번째 부분이 끝났습니다. 이 강의에서는 이전 강의의 기초 위에 데이터베이스를 구축하고, 첫 번째 모델을 생성하고 Django가 빠르게 자동으로 생성한 관리 사이트를 사용하겠습니다.
现在,打开mysite/settings.py。Django设置模块级的变量与正常的Python模块一样。
默认情况下,配置使用SQLite。如果你是数据库新手,或者想尝试学习Django,这是最简单的选择。SQLite包含在Python,所以不需要安装任何东西来支持你的数据库。当开始你的第一个真正的项目,可能需要使用更强大的数据库如:PostgreSQL,MySQL等,可以配置数据库切换就可以了。
如果你想使用其他数据库,请安装相应的数据库绑定,并更改以下键在数据库中“默认”的配置项,以适合您的数据库连接设置:
ENGINE – 输入'django.db.backends.sqlite3', 'django.db.backends.postgresql','django.db.backends.mysql',或'django.db.backends.oracle' NAME – 数据库的名称。如果使用SQLite,数据库会在您的计算机上创建文件;在这种情况下,名称应该是完整的绝对路径的文件,包括文件名。默认值为 os.path.join(BASE_DIR,“db.sqlite3)将存储在您的项目目录中的文件。
如果你不使用SQLite作为数据库,而使用其他设置,如USER, PASSWORD, 和 HOST 必须加入。欲了解更多详细信息,请参阅用于 数据库的参考文档。
当你编辑 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 – 정적 파일을 관리하는 프레임워크
이러한 애플리케이션에는 기본적으로 포함된 것과 같이 일반적인 예제가 포함됩니다.
중간에 몇 가지 애플리케이션이 최소한 하나의 데이터베이스 테이블을 사용하므로, 이 애플리케이션을 사용할 수 있도록 데이터베이스에서 테이블을 생성해야 합니다. 이를 위해 다음 명령어를 실행하세요:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 C:\Python27\mysite>python manage.py migrate 수행할 작업: 모든 이동 적용: admin, contenttypes, auth, sessions 이동 중... 모델 상태 표시 중... 완료 contenttypes.000 적용 중...1_initial... OK auth.000 적용 중...1_initial... OK admin.000 적용 중...1_initial... OK admin.000 적용 중...2_logentry_remove_auto_add... OK contenttypes.000 적용 중...2_remove_content_type_name... OK auth.000 적용 중...2_alter_permission_name_max_length... OK auth.000 적용 중...3_alter_user_email_max_length... OK auth.000 적용 중...4_alter_user_username_opts... OK auth.000 적용 중...5_alter_user_last_login_null... OK auth.000 적용 중...6_require_contenttypes_0002... OK auth.000 적용 중...7_alter_validators_add_error_messages... OK sessions.000 적용 중...1_initial... OK C:\Python27\mysite>
migrate 명령어는 INSTALLED_APPS 설정에 집중하여 사용자의 mysite에 따라 생성됩니다/settings.py 파일 데이터베이스 설정 및 데이터베이스 테이블 이동 시 애플리케이션 데이터베이스 테이블(후来的 가이드에서 논의할 것입니다)을 이동합니다. 적용 가능한 이동 메시지를 볼 수 있습니다. 관심이 있으면, 데이터베이스 클라이언트에서 명령어 실행하려면 예를 들어 타입 \dt (PostgreSQL), SHOW TABLES; (MySQL), .schema (SQLite), 또는 SELECT TABLE_NAME FROM USER_TABLES; (Oracle)를 사용하여 Django가 생성한 테이블을 표시합니다.
이제, 모델을 정의하겠습니다 - 본질적으로 데이터베이스는 다른 메타데이터를 사용하여 설계됩니다.
우리의 간단한 설문 조사 애플리케이션에서는 Question과 Choice 두 개의 모델을 생성할 것입니다. Question은 질문 제목과 발행 날짜를 가집니다. Choice는 두 개의 필드를 가집니다: 선택 텍스트와 투표 수. 각 선택은 하나의 질문과 연결됩니다.
이 개념들은 간단한 Python 클래스로 표현됩니다. polls 수정/models.py 파일, 따라서 polls/models.py는 다음과 같습니다:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 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 클래스의 서브클래스입니다. 각 모델은 많은 클래스 변수를 가지고 있으며, 각 변수는 모델 변수와 데이터베이스 테이블 필드를 연결합니다.
각 필드는 Field 클래스 인스턴스로 표현됩니다 – 예를 들어, CharField는 문자형 필드를, DateTimeField는 날짜 시간 필드를 표현합니다. 이는 Django에 각 필드가 저장할 데이터 타입을 알립니다.
각 Field 인스턴스(예: question_text 또는 pub_date)의 이름은 필드 이름입니다. 이는 기계 친화적인 형식입니다. Python 코드에서 이 값을 사용하면 데이터베이스는 이를 열 이름으로 사용합니다.
필드는 다양한 선택 사항이 있는 参数를 가질 수 있습니다; 이 예제에서는 투표 수의 기본 값을 0으로 설정했습니다.
마지막으로, 관계 정의에 주의해야 합니다. 여기서 외래키를 사용했습니다. 이는 Django에 각 선택이 질문과 연결되었다는 것을 알립니다. Django는 모든 일반적인 데이터베이스 관계를 지원합니다: 다대일, 다대다 및 일대일.
모델 코드는 작지만 Django의 많은 정보를 나타냅니다. 이를 통해 Django는 다음과 같은 작업을 할 수 있습니다:
이 애플리케이션에 데이터베이스를 생성합니다 (CREATE TABLE 문장)
Question과 Choice 객체에 대한 Python 데이터베이스 접근 API를 생성합니다
하지만 먼저 polls 항목이 설치된 애플리케이션을 알려야 합니다.
mysite을 다시 편집합니다/settings.py 파일을 편집하고 INSTALLED_APPS 설정에 문자열 'polls.apps.PollsConfig'을 포함하도록 변경합니다. 결과는 다음과 같습니다:
mysite/settings.py 파일 내용은 다음과 같습니다:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 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 투표 프로그램을 알고 있습니다. 다른 명령어를 실행해 보겠습니다:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 C:\Python27\mysite>python manage.py makemigrations polls 'polls'에 대한 Migrations: 0001_initial.py: - Choice 모델 생성 - Question 모델 생성 - choice에 question 필드 추가 C:\Python27\mysite>
makemigrations를 실행하여 Django에 모델에 대한 일부 변경을 했다고 알리고, 저장을 변경으로 전송으로 설정하고 싶다는 것을 알립니다(이 경우에는 최신입니다)
전송은 Django가 어떻게 변경된 모델을 저장하는지(당신의 데이터베이스 아키텍처에 의해 결정됩니다)- 그들은 단순히 디스크 위의 파일들입니다. 새로운 모델을 읽고 싶다면 파일 polls/migrations/0001_initial.py. Django가 항상 이들을 읽지 않도록 설정하겠지만, 인간이 편집할 수 있도록 설계했습니다. Django가 어떻게 변하는지 알고 수동으로 조정해야 합니다.
또한 migrations를 실행하고, 데이터베이스 스키마(테이블)를 자동으로 관리하는 명령어도 있습니다 - 이것이 바로 이전에 언급한 전송입니다. SQL을 통해 전송을 실행하는 것을 확인해 보겠습니다. sqlmigrate 명령어는 전송 이름을 반환하여 SQL에 표시합니다:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 $ python manage.py sqlmigrate polls 0001
아래와 같은 것을 볼 수 있을 것입니다(읽기 쉽게 다시 포맷했습니다):
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 C:\Python27\mysite>python manage.py sqlmigrate polls 0001 BEGIN; -- -- Choice 모델 생성 -- CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c hoice_text" varchar(200) NOT NULL, "votes" integer NOT NULL); -- -- Question 모델 생성 -- CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL); -- -- choice에 question 필드 추가 -- ALTER TABLE "polls_choice" RENAME TO "polls_choice__old"; CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "c hoice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer er NOT NULL REFERENCES "polls_question" ("id")); INSERT INTO "polls_choice" ("choice_text", "votes", "id", "question_id") SELECT "choice_text", "votes", "id", NULL FROM "polls_choice__old"; DROP TABLE "polls_choice__old"; CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id"); COMMIT; C:\Python27\mysite>
이동 명령은 아직 적용되지 않은 모든 이동을 실행하여 데이터베이스에서 실행합니다(Django는 데이터베이스에 특별한 이름으로 django_migrations로 사용되는 테이블을 통해 어떤 이동이 적용되었는지 추적합니다). - 기본적으로는 모델을 사용하여 데이터베이스 모델 변경을 동기화할 것입니다.
지금, 우리는 인터랙티브 파이썬 셸과 제공하는 API에 접근해 보겠습니다. 파이썬 명령 줄을 호출하려면 다음 명령을 사용하십시오:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 C:\Python27\mysite>python manage.py shell Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on wi n32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>>
只需键入“python” 来代替,因为manage.py设置DJANGO_SETTINGS_MODULE环境变量,这给Django Python 导入路径到 mysite/settings.py文件。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 >>> import django >>> django.setup()
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 >>> from polls.models import Question, Choice # import the model classes we just wrote. # No questions are in the system yet. >>> Question.objects.all() [] # 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. Note that this might say "1L" instead of "1", depending # on which database you're using. That's no biggie; it just means your # database backend prefers to return integers as Python long integer # objects. >>> 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() [<Question: Question object>]
这里需要等待一会儿. <Question: Question object> 完全是这个对象的无用表示。让我们来解决这个问题:通过编辑Question模型(在polls/models.py 文件),并添加一个__str__() 方法到这两个Question 和 Choice 模型:
polls/models.py文件内容如下:# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 from django.db import models from django.utils.encoding import python_2_unicode_compatible @python_2_unicode_compatible # only if you need to support Python 2 class Question(models.Model): # ... def __str__(self): return self.question_text @python_2_unicode_compatible # only if you need to support Python 2 class Choice(models.Model): # ... def __str__(self): return self.choice_text
添加 __str__() 方法非常重要,使用交互式提示处理添加到模型中,不仅为自己方便,也是因为对象的表示用于整个 Django 自动生成管理。
이들은 모두 정상적인 Python 메서드입니다. 우리는 사용자 정의 메서드를 추가하겠습니다. 여기서는 단순히 표시를 위해 poll스입니다./models.py
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 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)
이곳에 추가된 import datetime와 from django.utils import timezone는 Python의 표준 datetime 모듈과 django.utils.timezone에서의 Django 시간대 관련 유틸리티를 참조합니다. Python의 시간대 처리에 익숙하지 않다면, 다음을 참조하세요: 시간대 지원 문서。
이 변경 사항을 저장하고 다시 python manage.py shell을 실행하여 새로운 Python 인터랙티브 셸을 시작합니다:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 >>> from polls.models import Question, Choice # __str__() 추가가 작동했는지 확인하세요. >>> Question.objects.all() [<질문: 무엇이 있었나요?>] # Django는 전적으로 인터페이스로 운영되는 풍부한 데이터베이스 럭업 API를 제공합니다. # 키워드 인수. >>> Question.objects.filter(id=1) [<질문: 무엇이 있었나요?>] >>> Question.objects.filter(question_text__startswith='What') [<질문: 무엇이 있었나요?>] # 양적 질문을 올해 발행된 것을 가져옵니다. >>> from django.utils import timezone >>> current_year = timezone.now().year >>> Question.objects.get(pub_date__year=current_year) <질문: 무슨 일이 있나요?> # 존재하지 않는 ID를 요청, 이는 예외를 발생시킵니다. >>> Question.objects.get(id=2) Traceback (최근 호출 순서로): ... DoesNotExist: 질문이 존재하지 않는 쿼리와 일치 # 주요 키에 대한 검색은 가장 일반적인 경우이므로 Django는 # 주요-필요한 정확한 검색 # 다음은 Question.objects.get(id=1) >>> Question.objects.get(pk=1) <질문: 무슨 일이 있나요?> # 우리의 사용자 정의 메서드가 작동했는지 확인 >>> q = Question.objects.get(pk=1) >>> q.was_published_recently() True # Question에 몇 가지 선택지를 주세요. create 호출은 새로운 # Choice 객체가 INSERT 문을 수행하고 선택지를 집합에 추가 # 사용 가능한 선택지 수를 반환하고 새로운 Choice 객체를 생성. Django는 # ForeignKey 관계의 "다른 측"을 저장하는 집합 # (예: 질문의 선택지) API를 통해 접근할 수 있는 선택지 집합 >>> q = Question.objects.get(pk=1) # 선택지를 관련 객체 집합에서 표시 -- 아직 없습니다. >>> q.choice_set.all() [] # 세 가지 선택지를 생성합니다. >>> q.choice_set.create(choice_text='거의 없음', votes=0) <선택지: 거의 없음> >>> q.choice_set.create(choice_text='하늘', votes=0) <선택지: 하늘> >>> c = q.choice_set.create(choice_text='다시 해킹 중입니다', votes=0) # Choice 객체는 관련된 Question 객체에 대한 API 접근을 가집니다. >>> c.question <질문: 무슨 일이 있나요?> # 반대로: Question 객체는 Choice 객체에 접근할 수 있습니다. >>> q.choice_set.all() [<선택지: 거의 없음>, <선택지: 하늘>, <선택지: 다시 해킹 중입니다>] >>> q.choice_set.count() 3 # API는 필요한 만큼 관계를 자동으로 따릅니다. # 관계를 구분하기 위해 더블 언더스코어를 사용하세요. # 원하는 만큼 깊이 작동합니다; 제한이 없습니다. # 올해에 발행된 질문에 대한 모든 선택지를 찾습니다 # (위에서 생성한 'current_year' 변수를 재사용합니다). >>> Choice.objects.filter(question__pub_date__year=current_year) [<선택지: 거의 없음>, <선택지: 하늘>, <선택지: 다시 해킹 중입니다>] # 레터널 레이블을 지우겠습니다. 이를 위해 delete()를 사용하세요. >>> c = q.choice_set.filter(choice_text__startswith='Just hacking') >>> c.delete()
首先,我们需要创建可以登录到管理界面的用户。运行以下命令:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08c:\python27\mysite> python manage.py createsuperuser
输入你想要的用户名(随便一个),然后按Enter。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 Username: admin
然后,将提示输入电子邮件地址(随便一个):
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 Email address: [email protected]
最后一步是要输入密码。它会要求输入密码两次,第二次为第一的确认。
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 Password: ********** Password (again): ********* Superuser created successfully.
Django管理站点默认激活。让我们启动开发服务器,并探索它。
如果服务器未运行,启动它,如下所示:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 c:\python27\mysite>python manage.py runserver
现在,打开Web浏览器,进入“/admin/” 本地域名- 例如, http://127.0.0.1:8000/admin/ 应该看到管理员登录界面:
由于移在默认情况下开启,登录屏幕可能会显示在你自己的语言, 由于翻译在默认情况下开启,登录屏幕可能会显示在你自己的语言,
现在,尝试与在上一步中创建的超级用户帐号登录。应该会看到 Django 管理的首页:
你应该看到一些可编辑内容:组和用户。它们由django.contrib.auth,Django的認證框架提供。
poll应用程序在哪里?它不会显示在管理索引页面上。
只有一件事要做:我们需要告诉管理员这个Question对象有一个管理界面。要做到这一点,打开 polls/admin.py文件,并修改它如下:
# Filename : example.py # Copyright : 2020 By w3codebox # Author by : ko.oldtoolbag.com # Date : 2020-08-08 from django.contrib import admin from models import Question admin.site.register(Question)
지금까지 Question을 등록했기 때문에 Django는 관리 메인 페이지에서 표시되어야 한다고 알고 있습니다:
“Questions”를 클릭합니다. 지금, “change list” 페이지에서 문제를 확인합니다. 이 페이지는 데이터베이스에 있는 모든 문제를 표시하고, 하나를 선택하여 변경할 수 있도록 합니다. 이전에 생성한 문제도 있습니다:
“What's new?” 이 문제를 클릭하여 편집합니다:
주의해야 할 사항은 여기에 나열되어 있습니다:
폼은 Question 모델에서 자동으로 생성됩니다.
다른 모델 유형 필드(DateTimeField, CharField)는 해당 HTML 입력 요소에 대응합니다. 각 필드 유형은 Django 관리에서 어떻게 표시되는지 알고 있습니다.
각 DateTimeField 필드는 JavaScript 단축키를 받습니다. 날짜는 “Today” 단축키를 받으며 캘린더가弹出, 여러 번 “Now” 단축키를 받으며 창이弹出, 일반적으로 사용되는 입력 시간이 나타납니다.“Date published”을 수정하고 “Today”와 “Now” 단축키를 클릭합니다. 그런 다음 “Save and continue editing.”를 클릭하고, 오른쪽 상단에 “History”를 클릭합니다. 이 페이지에서 Django 관리를 통해 이 객체에 대한 모든 변경 사항, 수정자 이름 및 타임스탬프가 나타납니다: 코드 다운로드: http://pan.baidu.com/s/1jGR3wDg