Django是一个web框架
在Django中创建项目:
#创建项目 末尾句点让新项目使用合适的目录结构
PS C:\Users\hp\Desktop\learning_log> django-admin startproject learning_log .
#dir查看文件信息
PS C:\Users\hp\Desktop\learning_log> dir
目录: C:\Users\hp\Desktop\learning_log
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/3/1 14:11 .vscode
d----- 2021/3/1 14:17 learning_log
-a---- 2021/3/1 14:17 690 manage.py
PS C:\Users\hp\Desktop\learning_log> dir learning_log
目录: C:\Users\hp\Desktop\learning_log\learning_log
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2021/3/1 14:17 417 asgi.py
-a---- 2021/3/1 14:17 3200 settings.py #指定Django如何与系统交互以及如何管理项目
-a---- 2021/3/1 14:17 775 urls.py #应该创建哪些页面来响应浏览器请求
-a---- 2021/3/1 14:17 417 wsgi.py #帮助Django提供它创建的文件
-a---- 2021/3/1 14:17 0 __init__.py
创建数据库:
#迁移migrate,首次执行让django确保数据库与项目的当前状态匹配.使用SQLite中,首次将新建数据库
PS C:\Users\hp\Desktop\learning_log> 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
#SQLite是一种使用单个文件的数据库,是编写简单应用程序的理想选择,因为它让你不用太关注数据库管理的问题
PS C:\Users\hp\Desktop\learning_log> dir
目录: C:\Users\hp\Desktop\learning_log
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/3/1 14:11 .vscode
d----- 2021/3/1 14:33 learning_log
-a---- 2021/3/1 14:33 131072 db.sqlite3 #创建了一个文件db.sqlite3
-a---- 2021/3/1 14:17 690 manage.py
查看项目:
#使用命令runserver查看项目状态
PS C:\Users\hp\Desktop\learning_log> python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced). #通过检查确认正确创建了项目
March 01, 2021 - 14:59:15
Django version 3.1.7, using settings 'learning_log.settings' #指出Django的版本以及当前使用的设置文件名称
Starting development server at http://127.0.0.1:8000/ #指出项目的URL 在当前系统端口8000上侦听请求
Quit the server with CTRL-BREAK.
浏览器中输入http://localhost:8000/:
创建应用程序:
PS C:\Users\hp\Desktop\learning_log> python manage.py startapp learning_logs #新建learning_logs
PS C:\Users\hp\Desktop\learning_log> dir learning_logs
目录: C:\Users\hp\Desktop\learning_log\learning_logs
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/3/1 15:39 migrations
-a---- 2021/3/1 15:39 66 admin.py
-a---- 2021/3/1 15:39 105 apps.py
-a---- 2021/3/1 15:39 60 models.py #定义要在应用程序中管理的数据
-a---- 2021/3/1 15:39 63 tests.py
-a---- 2021/3/1 15:39 66 views.py
-a---- 2021/3/1 15:39 0 __init__.py
定义模型:
#每当需要修改"学习笔记"管理的数据时,都采取如下三个步骤:修改models.py,对learning_logs调用makemigrations,以及让Django迁移项目
①创建/修改models.py
from django.db import models
# 在这里创建模型
class Topic(models.Model): # 继承Model
'''用户学习的主题'''
# text是一个由CharField--由字符串组成的数据,即文本
# 需要存储少量文本,如名称、标题或城市,预留200字符的空间
text = models.CharField(max_length=200)
# 是一个DateTimeField--记录日期和时间的数据
# auto_now_add=True,每当用户创建新主题时,Django会自动设置为当前日期和时间
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
'''返回模型的字符串表示'''
# 显示主题的信息
return self.text
激活模型:
将INSTALLED_APP修改成:
INSTALLED_APPS = [
'learning_logs',
# 默认添加的应用程序
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
#接下来让Django修改数据库,使其能够存储于模型Topic相关信息
②对learning_logs调用makemigrations
PS C:\Users\hp\Desktop\learning_log> python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
learning_logs\migrations\0001_initial.py
- Create model Topic
#命令makemigrations让Django确定该如何修改数据库,使其能够存储与前面定义的新模型相关联的数据
#输出表明Django创建了一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表
③Django迁移项目
#下面应用这种迁移,让Django替我们修改数据库
PS C:\Users\hp\Desktop\1> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
Applying learning_logs.0001_initial... OK #应用迁移时正常
Django管理网站:
1.创建超级用户
PS C:\Users\hp\Desktop\learning_log> python manage.py createsuperuser
Username (leave blank to use 'hp'): 11_admin
Email address: [email protected]
Password:
Password (again):
Error: Your passwords didn't match.
2.向管理网站注册模型
#learning_logs中admin.py
from django.contrib import admin
from .models import Topic # 导入要注册的模型Topic
admin.site.register(Topic) # 让Django通过管理网站管理模型
登入网址http://localhost:8000/admin/login/?next=/admin/,输入超级账号
3.添加主题
定义模型Entry:
多对一关系:每个条目都与特定主题相关联,多个条目可关联到同一个主题
from django.db import models
# 在这里创建模型
class Topic(models.Model): # 继承Model
'''用户学习的主题'''
# text是一个由CharField--由字符串组成的数据,即文本
# 需要存储少量文本,如名称、标题或城市,预留200字符的空间
text = models.CharField(max_length=200)
# 是一个DateTimeField--记录日期和时间的数据
# auto_now_add=True,每当用户创建新主题时,Django会自动设置为当前日期和时间
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
'''返回模型的字符串表示'''
# 显示主题的信息
return self.text
class Entry(models.Model):
'''学习的有关某个主题的具体知识'''
# 外键,指向数据库中的另一台记录,这里将每个条目关联到特定主题
# 创建主题时,都分配了一个键(ID),需要在两项数据之间建立联系时,使用相关联键
#on_delete=models.CASCADE在删除主题的同时 删除所有与之相关联的条目,级联删除
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
#字段长度不受限制
text = models.TextField()
#按创建顺序呈现条目,并在每个条目旁放置时间戳
date_added = models.DateTimeField(auto_now_add=True)
#Meta存储用于管理模型的额外信息
class Meta:
#设置特殊属性,让Django在需要时使用Entries来表示多个条目
#如果没有这个类,Django将使用Entrys来表示多个条目
verbose_name_plural = 'entries'
def __str__(self):
'''返回模型的字符串表示'''
return f"{self.text[:50]}..."
迁移模型:
PS C:\Users\hp\Desktop\learning_log> python manage.py makemigrations learning_logs
#生成新的迁移文件,告诉Django如何修改数据库,使其能够存储与模型Entry相关信息
Migrations for 'learning_logs':
learning_logs\migrations\0002_entry.py
- Create model Entry
PS C:\Users\hp\Desktop\learning_log> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
Applying learning_logs.0002_entry... OK #迁移顺利
向管理网站注册Entry:
修改admin.py:
from django.contrib import admin
from .models import Topic, Entry # 导入要注册的模型Topic,Entry
admin.site.register(Topic) # 让Django通过管理网站管理模型
admin.site.register(Entry)
Django shell:
#输入数据,通过交互式终端会话以编程方式查看这些数据
PS C:\Users\hp\Desktop\learning_log> python manage.py shell
Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from learning_logs.models import Topic #导入模块Topic
>>> Topic.objects.all() #获取所有实例,这将返回一个查询集(queryset)的列表
#可以像遍历列表一样遍历查询集,查看分配给每个主题对象的ID:
>>> from learning_logs.models import Topic
>>> Topic.objects.all()
>>> topics = Topic.objects.all()
>>> for topic in topics:
... print(topic.id,topic)
...
1 Chess
2 Rock Climbing
#知道主题对象的ID后,就可使用方法Topic.objects.get()获取该对象并查看其属性
>>> t=Topic.objects.get(id=1)
>>> t.text
'Chess'
>>> t.date_added
datetime.datetime(2021, 3, 1, 8, 54, 20, 684484, tzinfo=
#查看相关联的条目
>>> t.entry_set.all()
Chinese and countries w...>]> #假如有模型Pizza,Topping.Topping通过外键关联到Pizza,如果有一个名为my_pizza的Pizza对象,就可使用代码my_pizza.topping_set.all()来获取披萨的所有配料