Django入门与实践-第5章:模型设计

模型

这些模型基本上代表了应用程序的数据库设计。

  • Board
  • Topic
  • Post

User 模型被命名为内置应用叫 auth,它以命名空间 django.contrib.auth 的形式出现在 INSTALLED_APPS 配置中。

boards/models.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from django.db import models
from django.contrib.auth.models import User

class Board(models.Model):
name = models.CharField(max_length=30, unique=True)
description = models.CharField(max_length=100)

class Topic(models.Model):
subject = models.CharField(max_length=255)
last_updated = models.DateTimeField(auto_now_add=True)
board = models.ForeignKey(Board, related_name='topics')
starter = models.ForeignKey(User, related_name='topics')

class Post(models.Model):
message = models.TextField(max_length=4000)
topic = models.ForeignKey(Topic, related_name='posts')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(null=True)
created_by = models.ForeignKey(User, related_name='posts')
updated_by = models.ForeignKey(User, null=True, related_name='+')
  • 所有模型都是django.db.models.Model类的子类。每个类将被转换为数据库表
  • 每个字段由 django.db.models.Field子类(内置在Django core)的实例表示,它们并将被转换为数据库的列
  • 字段 CharFieldTextFieldDateTimeField, IntegerFieldBooleanFieldDecimalField等等,都是 django.db.models.Field 的子类
  • 字段需要参数
  • unique=True,将强制数据库级别字段的唯一性
  • auto_now_add设置为True, 创建对象时为当前日期和时间
  • ForeignKey字段, 外键关联, 位置参数related_name,用于引用它关联的模型

下面您可以看到类图和Django模型的源代码之间的比较,绿线表示我们如何处理反向关系。

比较

迁移模型

打开终端 ,激活虚拟环境,转到 manage.py文件所在的文件夹,然后运行以下命令:

1
python manage.py makemigrations

输出的内容是:

1
2
3
4
5
6
7
Migrations for 'boards':
boards/migrations/0001_initial.py
- Create model Board
- Create model Post
- Create model Topic
- Add field topic to post
- Add field updated_by to post

Django 在 boards/migrations 目录创建了一个名为 0001_initial.py的文件。

迁移文件将被翻译成SQL语句。

1
python manage.py sqlmigrate boards 0001

Django ORM来完成,它是一个与数据库进行通信的抽象层

1
python manage.py migrate

输出内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Operations to perform:
Apply all migrations: admin, auth, boards, 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 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 boards.0001_initial... OK
Applying sessions.0001_initial... OK

试验 Models API

使用manage.py 工具加载我们的项目来启动 Python shell

1
python manage.py shell
1
2
3
4
5
Python 3.6.2 (default, Jul 17 2017, 16:44:45)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

项目将被添加到sys.path并加载Django。这意味着我们可以在项目中导入我们的模型和其他资源并使用它。

  1. 导入Board类开始:

    1
    from boards.models import Board
  2. 创建新的 boarrd 对象

    1
    board = Board(name='Django', description='This is a board about Django.')
  3. 将这个对象保存在数据库

    1
    board.save()
  4. Django会自动设置ID

    1
    2
    board.id
    1
  5. Python属性访问:

    1
    2
    board.name
    'Django'
    1
    2
    board.description
    'This is a board about Django.'
  6. 更新一个值

    1
    2
    board.description = 'Django discussion board.'
    board.save()
  7. 每个Django模型都带有一个特殊的属性; 我们称之为模型管理器(Model Manager)。你可以通过属性objects 来访问这个管理器,它主要用于数据库操作。例如,我们可以使用它来直接创建一个新的Board对象:

    1
    board = Board.objects.create(name='Python', description='General discussion about Python.')
  8. objects列出数据库中所有现有的列:

    1
    2
    Board.objects.all()
    <QuerySet [<Board: Board object>, <Board: Board object>]>

    QuerySet, 它是从数据库中查询的对象列表

  9. 管理器(Manager) 来查询数据库并返回单个对象

    1
    2
    3
    4
    django_board = Board.objects.get(id=1)

    django_board.name
    'Django'

    get方法的参数可以是模型的任何字段,但最好使用可唯一标识对象的字段来查询

  10. 退出交互式控制台:
    1
    exit()

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2021 朝着牛逼的道路一路狂奔 All Rights Reserved.

访客数 : | 访问量 :