Django Web应用程序(二)

创建应用程序

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

Django Web应用程序(二)_第1张图片
包含模型Topic的管理网站

定义模型 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 Web应用程序(二)_第2张图片
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() 来获取这张披萨的所有配料。

你可能感兴趣的:(Django Web应用程序(二))