创建应用程序
Django 项目由一系列应用程序组成,它们协同工作,让项目成为一个整体。
(ll_env) c5220056@GMPTIC:~/myworkplace$ python manage.py startapp learning_logs
(ll_env) c5220056@GMPTIC:~/myworkplace$ ls
db.sqlite3 learning_log learning_logs ll_env manage.py
(ll_env) c5220056@GMPTIC:~/myworkplace$ ls learning_logs
admin.py apps.py __init__.py migrations models.py tests.py views.py
startapp appname 命令让Django建立创建应用程序所需的基本设施。其中最重要的文件是 models.py, admin.py, views.py。
作用
- models.py: 定义我们要在应用程序中管理的数据
- admin.py: 管理超级用户
- views.py:
定义模型
在学习笔记中创建主题,用户输入的每个条目都与特定主题相关联,这些条目将以文本的方式显示。我们还需要储存每个条目的时间戳(即条目创建的时间)
models.py
from django.db import models
# Create your models here.
引入的模块 models 能让我们创建自己的模型。模型告诉Django如何处理应用程序中存储的数据。在代码层面,模型就是一个类,包含属性和方法。
表示用户将要存储的主题(Topic)的模型
from django.db import models
# Create your models here.
class Topic(models.Model):
"""用户学习的主题"""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
"""返回模型的字符串表示"""
return self.text
激活模型
settings.py 文件里 INSTALLED_APP 片段告诉 Django 哪些应用程序安装在项目中
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# my app
'learning_logs',
]
接下来需要让Django修改数据库,使其能够存储与模型Topic相关的信息。
(ll_env) c5220056@GMPTIC:~/myworkplace$ 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替我们修改数据库:
(ll_env) c5220056@GMPTIC:~/myworkplace$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
Applying learning_logs.0001_initial... OK
注:每当需要修改“学习笔记”管理的数据时,都要采取以下三个步骤:
- 修改models.py
- 对 learning_logs(也就是你的app)调用 makemigrations
- migrate 让Django迁移项目
Django管理网站
1. 创建超级用户
(ll_env) c5220056@GMPTIC:~/myworkplace$ python manage.py createsuperuser
Username (leave blank to use 'c5220056'): ll_admin
Email address:
Password:
Password (again):
Error: Blank passwords aren't allowed.
Password:
Password (again):
Superuser created successfully.
2. 向管理网站注册模型
注册Topic, 编辑 admin.py
from django.contrib import admin
# Register your models here.
from learning_logs.models import Topic
admin.site.register(Topic)
3. 使用超级用户账户访问管理网站
访问 http://localhost:8000/admin
定义模型 Entry
要记录学到的国际象棋和攀岩知识,需要为用户可在学习笔记中添加的条目定义模型。每个条目都与特定的主题相关联,这种关系被称为多对一关系,也就是多个条目可关联到同一个主题。
models.py
from django.db import models
# Create your models here.
class Topic(models.Model):
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.text
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] + "..."
注:书中这句date_added = models.DateTimeField(auto_now_add=True)会报错,改成上面的即可。
迁移模型Entry
由于添加了一个新模型,因此需要再次迁移数据库。我们慢慢将会对这个过程了如指掌:
- 修改 models.py
- 执行命令 python manage.py makemigrations appname
- 再执行命令 python manage.py migrate
(ll_env) c5220056@GMPTIC:~/myworkplace$ python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
learning_logs/migrations/0002_entry.py
- Create model Entry
(ll_env) c5220056@GMPTIC:~/myworkplace$ 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
# Register your models here.
from learning_logs.models import Topic, Entry
admin.site.register(Topic)
admin.site.register(Entry)
Django shell
Django交互式环境称为 Django shell,输入一些数据后,就可通过交互式终端会话以编程方式查看数据,是测试项目和排除故障的理想之地
启动一个 python 解释器
(ll_env) c5220056@GMPTIC:~/myworkplace$ python manage.py shell
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
查看给每个主题对象的ID
>>> from learning_logs.models import Topic
>>> topics = Topic.objects.all()
>>> for topic in topics:
... print(topic.id, topic)
...
1 Chess
2 Rock Climbing
Topic.objects.all()来获取模型Topic的所有实例。知道对象ID后,就可获取该对象并查看其任何属性。
查看主题Chess的属性 text 和 date_added 的值
>>> t = Topic.objects.get(id=1)
>>> t.text
'Chess'
>>> t.date_added
datetime.datetime(2018, 1, 31, 13, 59, 29, 608545, tzinfo=)
还可以查看与主题相关联的条目。我们给模型Entry定义了属性topic,这是一个ForeignKey,利用这种关联,Django能够获取与特定主题相关联的所有条目
>>> t.entry_set.all()
, ]>
为通过外键关系获取数据,可使用相关模型的小写名称、下划线和单词set。
例如,假设你有模型 Pizza 和 Topping, 而Topping通过一个外键关联到Pizza;如果你有一个名为my_pizza的对象,表示一张披萨,就可使用代码my_pizza.topping_set.all() 来获取这张披萨的所有配料。