在上一节打开的终端窗口中还运行着runserver,这边我们再打开一个新的终端窗口,并切换到manage.py所在的目录,激活虚拟环境,再执行命令startapp
ll_env\Scripts\activate
python manage.py startapp learning_lops
dir
dir learning_lops
python manage.py startapp learning_lops
让Django建立创建应用程序所需的基础设施,可以看见新增了一个文件夹learning_lops(见图一所示:)
dir learning_lops
查看文件夹中所含有的文件, models.py来定义我们要在应用程序中管理的数据。(见图二所示:)
我们想想涉及到的数据,每位同学都需要在学习笔记中创建很多主题。用户输入的每个条目都与特定的主题相关,这些条目将以文本的形式显示。我们还需要存储每个条目的时间戳,以便能够告诉用户创建的时间。
打开models.py文件,看看包含了哪些类容:
为我们导入了models模块,还让我们创建自己的模型,如下图所示
在代码层面,模型就是一个类,包含属性和方法。
下面是表示用户将要存储的主题的模型:
from django.db import models
class Topic(models.Model):
"""用户学习的主题"""
text=models.CharField(max_length=200)
date_added=models.DateTimeField(auto_now_add=True)
def __str__(self):
"""返回模型的字符串表示"""
return self.text
Topic
创建了一个Topic类,只包含两个属性text和date_added
text=models.CharField(max_length=200)
CharField由字符或文本组成的数据,需要存储少量的文本,如名称、标题或城市时,可使用CharField,定义CharField属性时,必须告诉Django预留多少空间,max_length=200,这边我们预留了最大空间为200字符。
date_added=models.DateTimeField(auto_now_add=True)
DateTimeField记录日期和时间的数据,传递了实参auto_now_add,每当用户创建主题时,这都让Django将这个属性自动设置成当前的日期和时间。
要使用模型,必须让Django将应用程序包含到项目中。
打开settings.py文件,显示如下:
这是一个元组,告诉Django项目是由哪些应用程序组成。
在INSTALLED_APPS文件中修改:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#我的应用程序
'learning_lops',
]
接下来,需要让Django修改数据库,使其能够存储与模型Topic相关的信息。
在终端执行下面的命令:
python manage.py makemigrations learning_lops
makemigrations
命令makemigrations 让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。
输出表明Django创建了一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表。
效果如图所示:
应用这种迁移,让Django替我们修改数据库:
python manage.py migrate
每当需要修改“学习笔记”管理数据时,都采取如下三个步骤:
为应用程序定义模型时,Django提供的管理网站(admin site)让你能够轻松的处理模型。网站的管理员可使用管理网站,但普通用户不能使用。本节将建立管理网站,并通过它使用模型Topic来添加一些主题。
python manage.py createsuperuser
你执行命令createsuperuser时,Django会提醒你输入超级用户(用户名、邮箱(邮箱可以为空)、密码)
这边我输入的:
用户名为 ll_admin
密码为 admin123
Django自动在管理网站中添加了一些模型,如User和Group,但对于我们创建的模型,必须手工进行注册。
Django在models.py所在的目录中创建了一个名为admin.py的文件。
在admin.py中修改:
from django.contrib import admin
from learning_lops.models import Topic
admin.site.register(Topic)
from learning_lops.models import Topic
导入我们要注册的模型Topic
admin.site.register(Topic)
在使用admin.site.register( )让Django通过管理网站管理我们的模型
现在我们使用超级用户账户访问管理网站:
http://127.0.0.1:8000/admin/
效果图如下所示:
输入我们的超级用户账户及密码
登录后效果图如下所示:
1、向管理网站注册Topic后,我们来添加主题,点击add
2、输入Chess,并点击save,主题创建成功
3、在创建一个主题,这时候我们可以看见,创建了两个主题Chess和Rock Climbing
要记录学到的国际象棋和攀岩知识,需要为用户可在学习笔记中添加条目定义模型。每个条目都与特定主题相关联,这种关系被称为多对一关系,即多个条目可关联到同一个主题。
在models.py文件中添加
class Entry(models.Model):
"""学到的有关某个主题的具体知识"""
topic=models.ForeignKey(Topic,on_delete=models.CASCADE)
text=models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural='entries'
def __str__(self):
"""返回模型的字符串表示"""
return self.text[:50]+"..."
class Entry(models.Model):
像Topic一样,Entry也继承了Django基类Model
topic=models.ForeignKey(Topic,on_delete=models.CASCADE)
topic是一个ForeignKey实例
text=models.TextField()
text是一个TextField实例,这种字段不需要长度限制
date_added = models.DateTimeField(auto_now_add=True)
属性date_added 让我们能够按照创建顺序呈现条目,并在每个条目旁边放置时间戳
class Meta:
在Entry中嵌套了Meta类,Meta存储用于管理模型的额外信息
== return self.text[:50]+"…"==
由于条目包含的文本可能很长,我们让Django只显示text的前50个字符
由于我们添加了一个新模型,因此我们再次迁移数据库
三步骤:
1、修改models.py
2、执行命令python manage.py makemigrations learning_lops
3、再执行命令python manage.py migrate
python manage.py makemigrations learning_lops
python manage.py migrate
生成了一个新的迁移文件-----0002_entry.py,它告诉Django如何修改数据库。执行命令migrate,迁移成功
我们还需要注册模型Entry,修改admin.py文件
from django.contrib import admin
from learning_lops.models import Topic,Entry
admin.site.register(Topic)
admin.site.register(Entry)
返回到 http://127.0.0.1:8000/admin/
将看到learing_lops下列出现了Entry
效果图如下所示:
点击add,进入你将发现多了个下拉列表,让你能够选择为哪个主题创建条目,还有一个用于输入条目的文本框。
选择Chess,并添加一个条目
返回到主条目管理页面,你会发现只显示了条目的开头部分,并不是全部文本,之前我们设置了 return self.text[:50]+"…"
继续在创建两个条目,分别创建Chess和Rock Climbing条目
综上插入的三个条目,在主条目管理界面显示出来
输入一些数据后,就可以通过交互式终端会话以编程方式查看这些数据。这种环境称为Django shell,是用来测试项目以及排除其他故障的理想之地:
python manage.py shell
from learning_lops.models import Topic
Topic.objects.all()
python manage.py shell
利用python manage.py shell启动一个python解释器,可使它来探索存储在项目数据库中的数据。
learning_lops.models
导入模块learning_lops.models中的模型Topic
Topic.objects.all()
在使用方法Topic.objects.all()来获取模型Topic的所有实例,返回的是一个列表
from learning_lops.models import Topic
Topic.objects.all()
topics=Topic.objects.all()
for topic in topics:
print(topic.id,topic)
将返回的值存储在topics中打印每个主题id,以及主题
效果如下图所示:
通过对象的ID后,就可以获得该对象并查看其任何属性
t=Topic.objects.get(id=1)
t.text
t.date_added
查看Chess的属性text和date_added
效果图如下所示:
我们可以查看与主题相关联的条目,前面我们给模型Entry定义了属性topic,这是一个ForeignKey,将条目与主题关联起来,Django能够获取与特定主题相关联的所有条目。
t.entry_set.all()